设计模式---工厂设计模式之抽象工厂模式

工厂模式是用来创建产品的,工厂方法模式是用来创建一种产品的,但有时我们会创建一组产品.这就需要用抽象工厂.在抽象中有两个概念需要了解产品族和产品等级结构

产品等级结构:产品的等级结构也就是产品的继承结构.(也就是说是子父类之间的关系,就比如说你有一个抽象类,子类继承这个抽象类那么子类和抽象类之间就构成了产品等级结构)纵向看

产品族:在抽象工厂模式中,由同一个工厂生产的,位于不同等级结构中的一组产品.(可以理解为就是一个抽象类所有的的子类的集合,例如华为生产手机也生产电脑,其中手机作为抽象类,荣耀系列手机,..一系列继承了手机的系列就构成了一个产品族)横向看

其实在这里就可以看出来抽象工厂模式与工厂方法模式的不同之处了,工厂方法模式是生产一个产品族的而抽象工厂模式是用来创建多个产品族

抽象工厂模式与模式与工厂方法模式的结构大致相同抽象工厂模式的结构为1.抽象工厂,2.多个具体的工厂(用来产生不同的产品族),3多个不同的产品抽象类4.具体的产品类具体的代码如下

/**
 * <p> 华为的抽象工厂 </p>
 *
 * @author Alemand
 * @since 2018/1/17
 */
public interface HuaweiFactory {
    /**
     * 生产手机
     *
     * @param phoneName 要创建什么手机的
     * @return 手机
     */
    Phone createPhone(String phoneName);
    /**
     * 生产电脑
     *
     * @param computerName 电脑的名字
     * @return 电脑
     */
    Computer createComputer(String computerName);
}
/**
 * <p>电脑产品的抽象类 </p>
 *
 * @author Alemand
 * @since 2018/1/17
 */
public interface Computer {
}
/**
 * <p> 具体的电脑 </p>
 *
 * @author Alemand
 * @since 2018/1/19
 */
public class MateBook10 implements Computer{
}
/**
 * <p> 具体的电脑 </p>
 *
 * @author Alemand
 * @since 2018/1/19
 */
public class MateBook9 implements Computer {
}
/**
 * <p> 手机产品的抽象类 </p>
 *
 * @author Alemand
 * @since 2018/1/17
 */
public interface Phone {
}
/**
 * <p> 具体的手机 </p>
 *
 * @author Alemand
 * @since 2018/1/19
 */
public class Mate10 implements Phone {
}
/**
 * <p> 具体的手机 </p>
 *
 * @author Alemand
 * @since 2018/1/19
 */
public class Mate9 implements Phone {
}
/**
 * <p> 具体的电脑工厂 </p>
 *
 * @author Alemand
 * @since 2018/1/19
 */
public class HuaweiComputerFactoryImpl implements HuaweiFactory {
    @Override
    public Phone createPhone(String phoneName) {
        return null;
    }
    /**
     * 生产电脑(里面所有的电脑的具体对象构成电脑产品族)
     *
     * @param computerName 电脑的名字
     * @return 电脑
     */
    @Override
    public Computer createComputer(String computerName) {
        if (computerName.equals("mateBook10")) {
            return new MateBook10();
        }
        if (computerName.equals("mateBook9")) {
            return new MateBook9();
        }
        return null;
    }
}
/**
 * <p> 具体的手机工厂 </p>
 *
 * @author Alemand
 * @since 2018/1/17
 */
public class HuaweiPhoneFactoryImpl implements HuaweiFactory {
    /**
     * 创建手机的方法(里面所有的手机的具体对象构成手机产品族)
     *
     * @return 具体的手机
     */
    @Override
    public Phone createPhone(String phoneName) {
        if (phoneName.equals("mate9")) {
            return new Mate9();
        }
        if (phoneName.equals("mate10")) {
            return new Mate10();
        }
        return null;
    }
    @Override
    public Computer createComputer(String computerName) {
        return null;
    }
}

抽象工厂的优点:

  • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
  • 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
抽象工厂的缺点:
  • 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
  • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。(开闭原则:对扩展开放,对修改关闭)

### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值