设计模式-抽象工厂模式(Abstract Factory Pattern)结构|原理|优缺点|场景|示例

这篇具有很好参考价值的文章主要介绍了设计模式-抽象工厂模式(Abstract Factory Pattern)结构|原理|优缺点|场景|示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 目录

        设计模式(分类)        设计模式(六大原则)   

    创建型

        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

     结构型

        适配器模式        装饰器模式        代理模式


抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种模式的核心目的是将一组相关产品的创建过程封装起来,使得客户端可以使用一个统一的接口来创建这些产品家族中的任何产品,而无需关心具体的实现细节。抽象工厂模式特别适用于处理具有产品族的产品结构,其中产品族是指位于不同等级结构中的一组产品,它们之间可能存在一定的依赖或约束关系。

模式结构

抽象工厂模式通常包含以下角色:

  1. 抽象工厂(Abstract Factory):定义了一个创建产品族的接口,声明了一系列创建不同产品的方法。这些方法返回的是相应产品接口的引用。

  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责生成一个或多个具体产品族中的产品对象。

  3. 抽象产品(Abstract Product):定义了产品族中每种产品的公共接口,它是所有具体产品类的基类或接口。

  4. 具体产品(Concrete Product):实现了抽象产品接口,是产品族中每种产品的具体实现。

工作原理

  • 客户端:通过调用具体工厂的接口来创建所需的产品对象,无需直接实例化具体产品类。
  • 具体工厂:实现了抽象工厂接口中定义的创建产品的方法,根据工厂的类型返回相应具体产品族中的产品对象。
  • 抽象产品:为产品对象定义了通用的接口,使得客户端可以使用抽象产品类型的引用来处理各种具体产品对象,无需关心具体产品类型。
  • 具体产品:实现了抽象产品的接口,提供了具体产品的功能实现。

优缺点

优点
  • 封装性:将一组相关产品的创建过程封装在一起,客户端无需了解具体产品的创建细节。
  • 一致性:提供一个统一的接口来创建相关或依赖的对象,保持产品族内部的一致性。
  • 灵活性与扩展性:当需要增加新的产品族时,只需增加一个新的具体工厂和相关产品类即可,不影响已有代码,符合“开闭原则”。
  • 隔离变化:通过抽象工厂隔离了高层模块与具体产品的依赖关系,使得高层模块无需关心产品族内部的变化。
缺点
  • 增加复杂性:对于简单系统,引入抽象工厂可能会增加不必要的复杂性。
  • 产品族扩展困难:如果产品族中添加新产品,不仅需要修改抽象工厂和具体工厂,还可能影响到使用抽象工厂的客户端代码。
  • 类的层级结构复杂:随着产品种类的增加,可能会导致类的层级结构变得复杂。

适用场景

  • 产品族内有多组相关产品:当一个系统需要创建一系列相关或依赖的产品对象时,且这些产品之间存在一定的约束或兼容性要求,抽象工厂模式非常适合。
  • 需要隔离高层模块与具体产品的依赖:如果希望高层模块不直接依赖具体产品的创建过程,可以通过抽象工厂来封装创建细节。
  • 系统需要支持多种产品系列:如果有多种产品系列(如不同操作系统上的图形界面组件),且希望在不修改客户端代码的情况下引入新的产品系列,可以使用抽象工厂模式。

代码示例(以Java为例)

// 抽象产品(操作系统相关的UI组件接口)
interface Button {
    void display();
}

interface TextField {
    void display();
}

// 具体产品(Windows平台的UI组件)
class WindowsButton implements Button {
    @Override
    public void display() {
        System.out.println("Displaying Windows button");
    }
}

class WindowsTextField implements TextField {
    @Override
    public void display() {
        System.out.println("Displaying Windows text field");
    }
}

// 具体产品(MacOS平台的UI组件)
class MacOSButton implements Button {
    @Override
    public void display() {
        System.out.println("Displaying MacOS button");
    }
}

class MacOSTextField implements TextField {
    @Override
    public void display() {
        System.out.println("Displaying MacOS text field");
    }
}

// 抽象工厂
interface UIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂(Windows平台UI工厂)
class WindowsUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂(MacOS平台UI工厂)
class MacOSUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public TextField createTextField() {
        return new MacOSTextField();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        UIFactory windowsFactory = new WindowsUIFactory();
        UIFactory macosFactory = new MacOSUIFactory();

        Button windowsButton = windowsFactory.createButton();
        TextField windowsTextField = windowsFactory.createTextField();
        windowsButton.display();
        windowsTextField.display();

        Button macosButton = macosFactory.createButton();
        TextField macosTextField = macosFactory.createTextField();
        macosButton.display();
        macosTextField.display();
    }
}

 在这个Java示例中:

  • ButtonTextField接口作为抽象产品,定义了UI组件的基本行为。
  • WindowsButtonWindowsTextFieldMacOSButtonMacOSTextField类是具体产品,它们分别实现了对应平台的UI组件功能。
  • UIFactory接口作为抽象工厂,定义了创建按钮和文本字段的方法。
  • WindowsUIFactoryMacOSUIFactory类是具体工厂,它们实现了UIFactory接口,分别创建对应平台的UI组件。
  • Main类的main方法中,客户端代码通过创建不同平台的工厂对象,然后调用工厂方法来创建所需UI组件,无需关心组件的具体实现细节。通过切换不同的工厂对象,可以轻松地在不同平台的UI风格之间切换。

这个Java示例展示了抽象工厂模式的应用,通过抽象工厂创建相关产品族中的对象,使得客户端代码与具体产品的实现细节解耦,增强了系统的灵活性和可扩展性。当需要支持新的操作系统平台时,只需添加新的具体工厂和UI组件类即可,无需修改已有的客户端代码。

代码示例(以Python为例)

# 抽象产品(操作系统相关的UI组件)
class Button:
    def display(self):
        raise NotImplementedError("Subclasses must implement this abstract method")

class TextField:
    def display(self):
        raise NotImplementedError("Subclasses must implement this abstract method")

# 具体产品(Windows平台的UI组件)
class WindowsButton(Button):
    def display(self):
        return "Displaying Windows button"

class WindowsTextField(TextField):
    def display(self):
        return "Displaying Windows text field"

# 具体产品(MacOS平台的UI组件)
class MacOSButton(Button):
    def display(self):
        return "Displaying MacOS button"

class MacOSTextField(TextField):
    def display(self):
        return "Displaying MacOS text field"

# 抽象工厂
class UIFactory:
    def create_button(self):
        raise NotImplementedError("Subclasses must implement this abstract method")

    def create_text_field(self):
        raise NotImplementedError("Subclasses must implement this abstract method")

# 具体工厂(Windows平台UI工厂)
class WindowsUIFactory(UIFactory):
    def create_button(self):
        return WindowsButton()

    def create_text_field(self):
        return WindowsTextField()

# 具体工厂(MacOS平台UI工厂)
class MacOSUIFactory(UIFactory):
    def create_button(self):
        return MacOSButton()

    def create_text_field(self):
        return MacOSTextField()

# 客户端代码
def main():
    windows_factory = WindowsUIFactory()
    macos_factory = MacOSUIFactory()

    button = windows_factory.create_button()
    text_field = windows_factory.create_text_field()
    print(button.display())
    print(text_field.display())

    button = macos_factory.create_button()
    text_field = macos_factory.create_text_field()
    print(button.display())
    print(text_field.display())

if __name__ == "__main__":
    main()

在这个Python示例中:

  • ButtonTextField类作为抽象产品,定义了UI组件的基本接口。
  • WindowsButtonWindowsTextFieldMacOSButtonMacOSTextField类是具体产品,它们分别实现了对应平台的UI组件功能。
  • UIFactory类作为抽象工厂,定义了创建按钮和文本字段的方法。
  • WindowsUIFactoryMacOSUIFactory类是具体工厂,它们实现了UIFactory接口,分别创建对应平台的UI组件。
  • 客户端代码中,通过创建不同平台的工厂对象,然后调用工厂方法来创建所需UI组件,无需关心组件的具体实现细节。通过切换不同的工厂对象,可以轻松地在不同平台的UI风格之间切换。

这个例子展示了抽象工厂模式在Python中的应用,通过抽象工厂创建相关产品族中的对象,使得客户端代码与具体产品的实现细节解耦,增强了系统的灵活性和可扩展性。当需要支持新的操作系统平台时,只需添加新的具体工厂和UI组件类即可,无需修改已有的客户端代码。 文章来源地址https://www.toymoban.com/news/detail-855145.html

到了这里,关于设计模式-抽象工厂模式(Abstract Factory Pattern)结构|原理|优缺点|场景|示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 抽象工厂模式-Abstract Factory Pattern

    原文地址:https://jaune162.blog/design-pattern/abstract-factory-pattern/ 首先我们由一个实际问题来引出抽象工厂模式。 考虑这样一个场景,系统中需要向OSS上传文件,以及通过OSS下载文件。而在系统中有不同的业务在使用这两个功能。如下图: 伪代码如下

    2024年02月20日
    浏览(37)
  • 抽象工厂模式(Abstract Factory Pattern)

    回顾工厂方法设计模式的不足:具体产品增加时,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度 产品等级结构:产品等级结构即产品的继承结构,即抽象产品与具体产品 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构

    2024年02月02日
    浏览(40)
  • 《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)

    在不具体指定产品类的情况下,为相互关联的产品簇或产品集提供创建接口,并向客户隐藏具体产品创建的细节或表示的对象。 AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。 ConcreteFactory(具体工厂):它实现了在抽象工厂中声明

    2024年02月14日
    浏览(45)
  • 抽象工厂模式(Abstract Factory)

    抽象工厂是一种 创建型设计模式 ,它能 创建一系列相关的对象,而无需指定其具体类 。 1. 问题 假设你正在开发一款家具商店模拟器。你的代码中包括一些类,用于表示: 一系列相关产品,例如椅子(Chair)、沙发(Sofa)和咖啡桌(CoffeeTable) 系列产品的不同变体,例如你

    2024年02月11日
    浏览(37)
  • 设计模式--工厂模式(Factory Pattern)

    工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对象的实例化逻辑。 工厂模式的主要目标是解耦对象的创建和使用,以及

    2024年02月10日
    浏览(37)
  • 大话设计模式——2.简单工厂模式(Simple Factory Pattern)

    定义:又称静态工厂方法,可以根据参数的不同返回不同类的实例,专门定义一个类(工厂类)来负责创建其他类的实例可通过类名直接调用,被创建的实例通常具有共同的父类。 UML图: 例子: 计算器中的加减乘除,可将不同的运算看成不同的对象,通过工厂类进行构建,

    2024年02月22日
    浏览(43)
  • Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。 简单工厂模式(Simple Factory Pattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需要知道对

    2024年02月06日
    浏览(52)
  • Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   实体类和工厂类均为单独实现,不影响已实现的类,方便扩展。 工厂方法模式(Factory Method Pattern)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工厂方法

    2024年02月06日
    浏览(41)
  • Abstract Factory 抽象工厂

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 其中: AbstractFactory声明一个创建抽象产品对象的操作接口。 ConcreteFactory实现创建具体产品对象的操作。 AbstractProduct为一类产品对象声明一个接口。 ConcreteProduct定义一个将被相应的具体工厂创建的

    2024年04月11日
    浏览(41)
  • 设计模式-工厂模式Factory

    一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。 简单工厂叫作静态工厂方法模式(Static Factory Method Pattern) 现在有一个场景,需要一个资源加载器,要 根据不用的url 进行资源加载,但是如果我们将 所有的加载实现代码全部封装在了一个

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包