抽象工厂模式
定义:创建一组相关或相互依赖的对象提供一个接口,并且无须指定他们的具体类。抽象工厂模式是工厂模式的升级版本,当有多个业务品种和业务分类时,通过抽象工厂模式产生需要的对象是一个很好的解决方式。有N个产品族,在抽象工厂类中就应该有N个创建方法。
首先假设有两个互相影响的产品族,比如汽车的左侧门和右侧门,它们数量相等--两个对象的约束,每个型号的车门都是不一样的,这是产品的等级约束,举一个通用代码的例子:
public abstract class AbstractProduct{ //每个产品公有的方法 public void shareMethod(){} //每个产品相同方法 不同实现 public abstract void doSomething(); } //A1实现类 public class ProductA1 extends AbstractProduct{ public void doSomething(){ System.out.print("a"); } } //A2实现类 public class ProductA2 extends AbstractProduct{ public void doSomething(){ System.out.print("b"); } } //抽象工厂类 有几个产品族就要有几个创建方法 public abstract class AbstractCreactor{ //创建A产品家族 public abstract AbstractProduct createProductA(); //创建B产品族 public abstract AbstractProduct createProductB(); } //产品等级1的实现类 public class Creactor1 extends AbstractCreator{ public AbstractProductA createProductA(){ return new ProductA1(); } public AbstractProductB createProductB(){ return new ProductB1(); } } //产品等级2的实现类 public class Creator2 extends AbstractCreator { //只生产产品等级为2的A产品 public AbstractProductA createProductA() { return new ProductA2(); } //只生产产品等级为2的B产品 public AbstractProductB createProductB() { return new ProductB2(); } } //场景类 public class Client{ public static void main(String[] args){ //定义两个工厂 AbstractCreactor creactor1 = new Creactor(); AbstractCreactor creactor2 = new Creactor(); //产生A1对象 AbstractProductA a1 = creator1.createProductA(); //产生A2对象 AbstractProductA a2 = creator2.createProductA(); //产生B1对象 AbstractProductB b1 = creator1.createProductB(); //产生B2对象 AbstractProductB b2 = creator2.createProductB(); } }
抽象工厂模式的优缺点:
优点:
- 封装性,产品类的实现类不需要高层模块关心,只需要关心抽象类和接口,只要知道工厂类是哪个,就可以创建需要的对象
- 产品族类的约束为非公开状态。具体的产品族约束在工厂内实现,高层模块调用不需要关心。
缺点:
- 最大缺点是产品扩展类非常困难
应用场景:
比较简单,在一个对象族中都有一个相同的约束,比如一个软件实体(文本编辑器等)同时在windows和linux平台开发,功能和界面相同,代码实现层不完全相同,这就是共同的约束:操作系统,这就可以使用抽象工厂模式。