抽象工厂模式

定义:创建一组相关或相互依赖的对象提供一个接口,并且无须指定他们的具体类。抽象工厂模式是工厂模式的升级版本,当有多个业务品种和业务分类时,通过抽象工厂模式产生需要的对象是一个很好的解决方式。有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平台开发,功能和界面相同,代码实现层不完全相同,这就是共同的约束:操作系统,这就可以使用抽象工厂模式。

 

posted @ 2018-09-20 00:36  行者林  阅读(97)  评论(0编辑  收藏  举报