设计模式——抽象工厂模式

61 阅读1分钟

一、定义

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类

二、通用代码

  1. A产品族
//A抽象产品类
public abstract class AbstractProductA{
    public void shareMethod(){
        //A产品的通用方法
    }
     //每个产品的相同方法,不同实现
    public abstract void doSomethings();
}

//产品A1的实现类
public class ProductA1 extends AbstractProductA1{
    public void doSomethings(){
        System.out.println("产品A1的实现方法");
    }
}

//产品A2的实现类
public class ProductA1 extends AbstractProductA2{
    public void doSomethings(){
        System.out.println("产品A2的实现方法");
    }
}
  1. B产品族代码与A产品族相同
  2. 工厂类
//抽象工厂类
public abstract class AbstractCreator{
    //创建A产品族
    public abstract AbstractProductA createProductA();
    //创建B产品族
    public abstract AbstractProductB createProductB();
}

//实现工厂类1,生产各系列的1号产品
public class Creator1 extends AbstractCreator{
    public AbstractProductA createProductA(){
        return new ProductA1();
    }
    
    public AbstractProductB createProductB(){
        return new ProductB1();
    }
}

//实现工厂类2,生产各系列的2号产品
public class Creator2 extends AbstractCreator{
    public AbstractProductA createProductA(){
        return new ProductA2();
    }
    
    public AbstractProductB createProductB(){
        return new ProductB2();
    }
}
  1. 场景类
public class Client{
    public static void main(String[] args){
        //定义两个工厂
        AbstractCreator creator1 = new Creator1();
        AbstractCreator creator2 = new Creator2();
        
        //生产各产品对象
        AbstractProductA a1 = creator1.createProductA();
        AbstractProductB b1 = creator1.createProductB();
        AbstractProductA a2 = creator2.createProductA();
        AbstractProductB b2 = creator2.createProductB();
        
    }
}

三、优点

  1. 封装性,高层模块无需关心每个产品的实现类。
  2. 产品族内的约束为非公开状态。

四、缺点

  1. 产品族扩展非常困难
    • 增加一个产品族,与产品族相关的各工厂与场景类都需要更改

五、应用场景

  1. 一个对象族拥有相同的约束的情况下

六、注意

  1. 产品族扩展困难,但不是产品子类扩展困难。