深入浅出设计模式 - 抽象工厂模式

简介: 深入浅出设计模式 - 抽象工厂模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

1687839548267.jpg

1、什么是抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它是工厂方法模式的扩展,它通过组合多个工厂方法模式来实现一组对象的创建。

在抽象工厂模式中,有一个抽象工厂类负责定义创建一系列相关或相互依赖对象的接口,而具体的工厂类实现这个接口来创建具体的对象。每个具体的工厂类都负责创建一组对象,这些对象之间有一定的关联关系,可以满足一些特定的需求。

抽象工厂模式的优点是可以在不修改客户端代码的情况下,增加或修改一组对象的创建方式。同时,它能够保证一组对象的创建是相互依赖的,并且可以保证这些对象之间的兼容性。

抽象工厂模式的缺点是增加新的产品族比较困难,需要修改抽象工厂接口和所有的具体工厂类,同时也会增加系统的复杂度。

2、抽象工厂模式优缺点

抽象工厂模式的优点:

  1. 抽象工厂模式可以将一组相关的产品族统一到一起创建,使得客户端更加方便使用这些产品。
  2. 抽象工厂模式可以保证产品之间的兼容性,因为同一个工厂创建的产品都是相互配合使用的。
  3. 抽象工厂模式可以隔离具体类的生成,使得客户端不需要知道具体的类名,只需要知道工厂的名字即可。

抽象工厂模式的缺点:

  1. 抽象工厂模式的扩展性较差,新增一个产品族时需要修改抽象工厂接口和所有的具体工厂类。
  2. 抽象工厂模式的代码量较大,因为需要定义很多抽象类和接口。
  3. 抽象工厂模式只适用于产品族的创建,不适用于单个产品的创建。如果只需要创建单个产品,建议使用工厂方法模式。

3、抽象工厂模式的结构

抽象工厂模式的结构包括以下几个部分:

  1. 抽象工厂(Abstract Factory):定义了一个接口,用于创建一组相关或者相互依赖的对象。
  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,用于创建一组具体的产品。
  3. 抽象产品(Abstract Product):定义了产品的接口,用于描述产品的属性和行为。
  4. 具体产品(Concrete Product):实现了抽象产品接口,具体产品是由具体工厂创建的。

抽象工厂模式的结构可以用以下 UML 类图表示:

|   AbstractFactory |       |   AbstractProduct |
 -----------------          -----------------
| + createProductA()|<------| + operation()     |
| + createProductB()|        -----------------
 -----------------                 ^
        ^                          |
        |                          |
 -----------------          -----------------
|  ConcreteFactory |        |  ConcreteProduct |
 -----------------          -----------------
| + createProductA()|<------| + operation()     |
| + createProductB()|        -----------------
 -----------------

在这个结构中,抽象工厂定义了创建一组相关产品的接口,具体工厂实现了抽象工厂接口,用于创建一组具体的产品。抽象产品定义了产品的接口,具体产品实现了抽象产品接口,是由具体工厂创建的。客户端通过抽象工厂和抽象产品来使用具体工厂和具体产品,从而实现了产品族的创建。

4、抽象工厂模式的代码案例

抽象产品类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  抽象产品类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 12:08
 */
public interface Button {
   
   
    void paint();
}

具体产品类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体产品类 - Windows
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:08
 */
public class WindowsButton implements Button {
   
   
    @Override
    public void paint() {
   
   
        System.out.println("Windows Button");
    }
}
package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体产品类 - Mac
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:08
 */
public class MacButton implements Button {
   
   
    @Override
    public void paint() {
   
   
        System.out.println("Mac Button");
    }
}

抽象工厂类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  抽象工厂类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 12:09
 */
public interface GUIFactory {
   
   
    Button createButton();
}

具体工厂类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体工厂类 - WindowsFactory
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:09
 */
public class WindowsFactory implements GUIFactory {
   
   
    @Override
    public Button createButton() {
   
   
        return new WindowsButton();
    }
}
package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体工厂类 - MacFactory
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:10
 */
public class MacFactory implements GUIFactory {
   
   
    @Override
    public Button createButton() {
   
   
        return new MacButton();
    }
}

客户端代码:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  客户端
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:10
 */
public class Client {
   
   
    private Button button;

    public Client(GUIFactory factory) {
   
   
        button = factory.createButton();
    }

    public void paint() {
   
   
        button.paint();
    }

    public static void main(String[] args) {
   
   
        Client windowsClient = new Client(new WindowsFactory());
        Client macClient = new Client(new MacFactory());
        windowsClient.paint();
        macClient.paint();
    }
}

输出如下:

Windows Button
Mac Button

Process finished with exit code 0

4、抽象工厂模式的应用场景

抽象工厂模式在 Java 中的应用场景包括:

  1. 当需要创建一组相关或相互依赖的对象时,使用抽象工厂模式可以将对象的创建过程封装起来,使得客户端不需要知道具体的实现细节。
  2. 当需要在不同的平台或环境下使用不同的实现时,使用抽象工厂模式可以使得客户端代码与具体实现解耦,从而更容易进行维护和扩展。
  3. 当需要支持多种不同类型的产品,且这些产品之间存在一定的关联关系时,使用抽象工厂模式可以将不同类型的产品的创建过程封装起来,使得客户端可以方便地使用这些产品。
  4. 当需要在运行时动态地更改产品的实现时,使用抽象工厂模式可以使得客户端代码与具体实现解耦,从而更容易进行动态配置和管理。

总之,抽象工厂模式适用于需要创建一组相关或相互依赖的对象,并且需要支持多种不同类型的产品,或者需要在不同的平台或环境下使用不同的实现的情况。

1686494501743.jpg

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊

目录
相关文章
|
23天前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
16 0
|
23天前
|
设计模式 Java
Java设计模式【三】:抽象工厂模式
Java设计模式【三】:抽象工厂模式
26 0
|
16天前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
21天前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
30 2
|
23天前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
123 4
|
23天前
|
设计模式 SQL Java
【设计模式】为什么说抽象工厂模式更好?
【设计模式】为什么说抽象工厂模式更好?
22 0
|
23天前
|
设计模式 Java
Java 设计模式:工厂模式与抽象工厂模式的解析与应用
【4月更文挑战第27天】设计模式是软件开发中用于解决常见问题的典型解决方案。在 Java 中,工厂模式和抽象工厂模式是创建型模式中非常核心的模式,它们主要用于对象的创建,有助于增加程序的灵活性和扩展性。本博客将详细介绍这两种模式的概念、区别以及如何在实际项目中应用这些模式。
19 1
|
23天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式
[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式
|
23天前
|
设计模式 存储 XML
[设计模式 Go实现] 创建型~抽象工厂模式
[设计模式 Go实现] 创建型~抽象工厂模式
|
23天前
|
设计模式 Java
小谈设计模式(16)—抽象工厂模式
小谈设计模式(16)—抽象工厂模式