设计模式-抽象工厂

抽象工厂

抽象工厂模式(Abstract Factory)是一个比较复杂的创建型模式。
抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

  • 使用抽象工厂模式一般要满足以下条件。
    1.系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
    2.系统一次只可能消费其中某一族产品,即同族的产品一起使用。

  • 抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下
    1.可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
    当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
    2.抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
    缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

UML图找了两张
在这里插入图片描述
在这里插入图片描述
理解作用可以看
不同的品牌可以创造一样的产品 但是这些产品拥有自己的特性
在这里插入图片描述

模式的结构

抽象工厂模式的主要角色如下。

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

实现

/**
 * 抽象工厂 更复杂的创造型工厂
 *
 */
public class AbstractFactory {

    /**
     * 电视 产品
     */
    interface TV{

    }

    /**
     * 空调 产品
     */
    interface AirConditioner{

    }

    /**
     * 电视工厂
     */
    interface TVAbstractFactory{
        TV createHETV();

        TV createTCLTV();
    }

    /**
     * 空调工厂
     */
    interface AirConditionerAbstractFactory{
        AirConditioner createHEAirConditioner();
        AirConditioner createTCLAirConditioner();
    }

    /**
     * 产品的实现类
     */
    class HETv implements TV{

    }

    class TCLTv implements TV{

    }

    class HEAirConditioner implements AirConditioner{

    }

    class TCLAirConditioner implements AirConditioner{

    }

    /**
     * 具体工厂类
     */
     class TVFactory implements TVAbstractFactory{

        @Override
        public TV createHETV() {
            System.out.println("新建一个海尔电视");
            return new HETv();
        }

        @Override
        public TV createTCLTV() {
            System.out.println("新建一个TCL电视");
            return new TCLTv();
        }
    }

    class AirConditionerFactory implements AirConditionerAbstractFactory{

        @Override
        public AirConditioner createHEAirConditioner() {
            System.out.println("新建一个海尔空调");
            return new HEAirConditioner();
        }

        @Override
        public AirConditioner createTCLAirConditioner() {
            System.out.println("新建一个TCL空调");
            return new TCLAirConditioner();
        }
    }

    @Test
    public void test1(){
        TVAbstractFactory tvFactory = new TVFactory();
        tvFactory.createHETV();
        tvFactory.createTCLTV();

        AirConditionerAbstractFactory airConditionerAbstractFactory = new AirConditionerFactory();
        airConditionerAbstractFactory.createHEAirConditioner();
        airConditionerAbstractFactory.createTCLAirConditioner();
    }

}

在这里插入图片描述
这里是对产品类型进行抽象,也就是电视工厂可以创造 海尔或者TCL的电视,空调工厂可以创造海尔或者TCL的空调,这样如果拓展会更容易,加入有新的同类型产品直接在相应的两个工厂和产品加入拓展即可,但是这样的所有的类都会改变,会比较麻烦,也比较难理解

假如加入一个格力空调 则 直接抽象工厂加一个创建格力空调的方法即可

/**
 * 抽象工厂 更复杂的创造型工厂
 *
 */
public class AbstractFactory {

    /**
     * 电视 产品
     */
    interface TV{

    }

    /**
     * 空调 产品
     */
    interface AirConditioner{

    }

    /**
     * 电视工厂
     */
    interface TVAbstractFactory{
        TV createHETV();

        TV createTCLTV();
    }

    /**
     * 空调工厂
     */
    interface AirConditionerAbstractFactory{
        AirConditioner createHEAirConditioner();
        AirConditioner createTCLAirConditioner();
        AirConditioner createGLAirConditioner();
    }

    /**
     * 产品的实现类
     */
    class HETv implements TV{

    }

    class TCLTv implements TV{

    }

    class HEAirConditioner implements AirConditioner{

    }

    class TCLAirConditioner implements AirConditioner{

    }

    class GLAirConditioner implements AirConditioner{

    }

    /**
     * 具体工厂类
     */
     class TVFactory implements TVAbstractFactory{

        @Override
        public TV createHETV() {
            System.out.println("新建一个海尔电视");
            return new HETv();
        }

        @Override
        public TV createTCLTV() {
            System.out.println("新建一个TCL电视");
            return new TCLTv();
        }
    }

    class AirConditionerFactory implements AirConditionerAbstractFactory{

        @Override
        public AirConditioner createHEAirConditioner() {
            System.out.println("新建一个海尔空调");
            return new HEAirConditioner();
        }

        @Override
        public AirConditioner createTCLAirConditioner() {
            System.out.println("新建一个TCL空调");
            return new TCLAirConditioner();
        }

        @Override
        public AirConditioner createGLAirConditioner() {
            System.out.println("新建一个格力空调");
            return new GLAirConditioner();
        }
    }

    @Test
    public void test1(){
        TVAbstractFactory tvFactory = new TVFactory();
        tvFactory.createHETV();
        tvFactory.createTCLTV();

        AirConditionerAbstractFactory airConditionerAbstractFactory = new AirConditionerFactory();
        airConditionerAbstractFactory.createHEAirConditioner();
        airConditionerAbstractFactory.createTCLAirConditioner();

        airConditionerAbstractFactory.createGLAirConditioner();
    }

}
### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^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、付费专栏及课程。

余额充值