创建型模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
/** 通用源码 */

// 抽象产品类A
public abstract class AbstractProductA{
    // 每个产品共有的方法
    public void shareMethod(){
    }
    // 每个产品相同方法、不同实现
    public abstract void doSomething();
}
// 产品A1[ProductA1]的实现类:略
// 产品A2[ProductA2]的实现类:略

// 抽象产品类B
public abstract class AbstractProductB{
    // 每个产品共有的方法
    public void shareMethod(){
    }
    // 每个产品相同方法、不同实现
    public abstract void doSomething();
}
// 产品B1[ProductB1]的实现类:略
// 产品B2[ProductB2]的实现类:略

// 抽象工厂类
public abstract class AbstractCreator{
    // 创建A产品家族
    public abstract AbstractProductA createProductA();
    // 创建B产品家族
    public abstract AbstractProductB createProductB();
    /** 有N个产品族,在抽象工厂类中就应该有N个创建方法 */
}
 
// 产品等级1的实现工厂类
public class Creator1 extends AbstractCreator{
    // 只生产产品等级为1的A产品
    public AbstractProductA createProductA(){
        return new ProductA1();
    }
    // 只生产产品等级为1的B产品
    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();
    } 
}
/** 有M个产品等级就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务 */

// 场景类0
public class Client{
    public static void main(String[] args){
        // 定义两个工厂
        AbstractCreator creator1 = new Creator1();
        AbstractCreator creator2 = new Creator2();
        // 产生A1对象
        AbstractProductA a1 = creator1.createProductA();
        // 产生A2对象
        AbstractProductA a2 = creator2.createProductA();
        // 产生B1对象
        AbstractProductB b1 = creator1.createProductB();
        // 产生B2对象
        AbstractProductB b2 = creator2.createProductB();
        /*
         * 业务逻辑······
         */
    }
}
// 在场景类中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接生产一个产品对象,无须关心它的实现类。
  • 抽象工厂模式的优点
    封装性,高层模块不关心具体实现类,只关心接口/抽象,对象的创建由工厂类去实现,只要知道工厂类就可以创建出所需要的对象;
    产品族内的约束为非公开状态,调用工厂类对于高层模块来说是透明的,高层模块无须知道工厂中的约束。
  • 抽象工厂模式的缺点
    扩展产品族很困难,会违反开闭原则。
  • 抽象工厂模式的使用场景
    一个对象族(或是一组没有关系的对象)都有相同的约束,就可以使用抽象工厂模式。例如针对不同操作系统类型实现文本编辑器和图片编辑器,文本编辑器和图片编辑器就有了共同的约束条件:操作系统类型。
  • 抽象工厂模式的注意事项
    注意是产品族扩展困难,不是产品等级。产品等级的扩展是容易的,直接新增一个对应工厂类来实现生产任务就行;
    就是说横向扩展容易,纵向扩展难。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容