工厂模式之抽象工厂

工厂模式之抽象工厂

前言

简单工厂中我们解耦了对象创建职责和使用职责,将对象的创建分离到工厂类中,随之产生的问题是对象创建逻辑集中在一起并且越来越复杂,难以维护。为了解决这个问题,引入了抽象工厂的概念。即由抽象工厂统一对象创建行为,具体工厂负责创建每一种产品。在这种模式下,创建逻辑被分散到各个具体工厂中。但是问题又来了,随着产品的增多,工厂类和产品类成对增加。系统中增加了大量的类,导致系统越来越庞大和复杂,难以维护!

抽象工厂模式

前面提到的类数量激增问题是工厂方法模式的主要缺陷,那么有什么好的办法解决呢?在原来的工厂类中只存在一个或一组重载的对象创建方法,现在我们可以考虑将相关产品的创建放在一个工厂类中,这样一来工厂类的数量就会大大减少。什么是相关产品呢?这里要提一个产品族的概念。比如电脑相关的产品,有主机,显示器,键盘,鼠标。主机有很多品牌,显示器也有很多品牌,键盘鼠标同理。那么要生产一个电脑出来,就需要从这四个产品中各选一个品牌出来,这就是一个产品族。对应到工厂类就是具有产生这一组产品的方法。

简单代码示例:

/**
 *抽象产品
 */
interface MainFrame {} //主机

interface Displayer {} //显示器

interface Keybord {} //键盘

interface Mouse {} //鼠标

/**
 *抽象工厂
 */
interface Factory {
    //主机
    MainFrame getMainFrame();
    //显示器
    Displayer getDisplayer();
    //键盘
    Keybord getKeybord();
    //鼠标
    Mouse getMouse();
}

public static void main(String args[]) {

    Factory lenovoFactory = new LenovoFactory(); //获取一个联想电脑工厂
    //获取一组联想电脑组件,组成一台电脑
    lenovoFactory.getMainFrame();
    lenovoFactory.getDisplayer();
    lenovoFactory.getKeybord();
    lenovoFactory.getMouse();

    //这里省略了具体产品实现和工厂类实现
}

总结

抽象工厂模式可以说是工厂方法模式在具体场景下的延伸。由于它提供了更为强大的工厂类并且具备较好的扩展性,在软件开发中得到了广泛的应用,尤其是在一些框架和API类库的设计中例如AWTJava抽象窗口工具包)。

思考

抽象工厂模式可以保证系统在同一时刻使用的是一组相关的对象,而且在系统中增加一组相关对象以及对应工厂无需修改原有代码,符合开闭原则,但是当修改产品族时不得不对抽象代码修改。所以抽象工厂模式适用于产品结构稳定的系统。