一、工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类
(1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者。
(2)实例:
抽象产品类
1 public abstract class ProductNoodle {
2 public abstract String description();
3 }
具体产品类
1 public class ConcreteNoodleA extends ProductNoodle { 2 3 4 @Override 5 public String description() { 6 return "加葱的面条"; 7 } 8 9 }
1 public class ConcreteNoodleB extends ProductNoodle { 2 3 @Override 4 public String description() { 5 return "加蒜的面条"; 6 } 7 8 }
抽象工厂类
1 public abstract class NoodleFactory { 2 public abstract ProductNoodle createNoodle(String type); 3 }
具体工厂类
1 public class ConcreteFactoryA extends NoodleFactory { 2 3 @Override 4 public ProductNoodle createNoodle(String type) { 5 if("A".equals(type)){ 6 return new ConcreteNoodleA(); 7 } 8 if("B".equals(type)){ 9 return new ConcreteNoodleB(); 10 } 11 return null; 12 } 13 14 }
最后客户端直接调用工厂方法产生产品。可以按需求决定使用的具体工厂为哪个。
二、抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产品的具体产品是什么,这样客户就从具体的产品中解耦出来。
涉及角色:抽象产品,具体产品,抽象创建者,具体创建者。
三、工厂模式和抽象工厂区别:
(1)工厂方法使用的是继承,抽象工厂方法使用的组合。
(2)工厂方法:通过子类来创建对象,这种做法,客户只需要知道他们使用的是抽象类就可以了,而由子类负责创建具体类型。
抽象工厂:提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法,要使用这个工厂,必须先实例化。然后传入抽象类型的代码中。