【Python笔记-设计模式】抽象工厂模式

一、说明

(一) 解决问题

抽象工厂是一种创建型设计模式,主要解决接口选择的问题。能够创建一系列相关的对象,而无需指定其具体类。

(二) 使用场景

系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口。

例如:有一个家具工厂,可以生产的产品有椅子、沙发、咖啡桌,各产品又分为不同的风格。

而客户需要的是相同风格的各类产品

二、结构

  1. 抽象产品 (Abstract Product) 为构成系列产品的一组不同但相关的产品声明接口。
  2. 具体产品 (Concrete Product) 是抽象产品的多种不同类型实现。 所有变体 (维多利亚/现代) 都必须实现相应的抽象产品 (椅子/沙发)。
  3. 抽象工厂 (Abstract Factory) 接口声明了一组创建各种抽象产品的方法。
  4. 具体工厂 (Concrete Factory) 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体, 且仅创建此种产品变体。
  5. 尽管具体工厂会对具体产品进行初始化, 其构建方法签名必须返回相应的抽象产品。 这样, 使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。 客户端 (Client) 只需通过抽象接口调用工厂和产品对象, 就能与任何具体工厂/产品变体交互。

三、伪代码

__doc__ = """
抽象工厂模式

例:有一个家具工厂,可以生产的产品有椅子、沙发、咖啡桌,各产品又分为不同的风格。
"""

from abc import ABC, abstractmethod


class AbstractFactory(ABC):
    """
    抽象工厂基类
    提供创建三种家具抽象方法
    """

    @abstractmethod
    def create_chair(self):
        pass

    @abstractmethod
    def create_sofa(self):
        pass

    @abstractmethod
    def create_coffee_table(self):
        pass


class ModernFactory(AbstractFactory):
    """
    具体工厂基类
    实现创建现代风格家具的方法
    """

    def create_chair(self):
        return ModernChair()

    def create_sofa(self):
        return ModernSofa()

    def create_coffee_table(self):
        return ModernCoffeeTable()


class VictorianFactory(AbstractFactory):
    """
    具体工厂基类
    实现创建维多利亚风格家具的方法
    """

    def create_chair(self):
        return VictorianChair()

    def create_sofa(self):
        return VictorianSofa()

    def create_coffee_table(self):
        return VictorianCoffeeTable()


class AbstractProduct(ABC):
    """
    抽象产品基类
    提供使用抽象方法
    """

    @abstractmethod
    def use(self):
        pass


class ModernChair(AbstractProduct):
    """具体产品"""

    def use(self):
        print("现代风格椅子")


class ModernSofa(AbstractProduct):
    """具体产品"""

    def use(self):
        print("现代风格沙发")


class ModernCoffeeTable(AbstractProduct):
    """具体产品"""

    def use(self):
        print("现代风格咖啡桌")


class VictorianChair(AbstractProduct):
    """具体产品"""

    def use(self):
        print("维多利亚风格椅子")


class VictorianSofa(AbstractProduct):
    """具体产品"""

    def use(self):
        print("维多利亚风格沙发")


class VictorianCoffeeTable(AbstractProduct):
    """具体产品"""

    def use(self):
        print("维多利亚风格咖啡桌")


def client_code(factory):
    """客户端"""
    chair = factory.create_chair()
    sofa = factory.create_sofa()
    coffee_table = factory.create_coffee_table()

    chair.use()
    sofa.use()
    coffee_table.use()


if __name__ == '__main__':
    """
    Client: Testing client code with the first factory type:
    现代风格椅子
    现代风格沙发
    现代风格咖啡桌
    
    Client: Testing the same client code with the second factory type:
    维多利亚风格椅子
    维多利亚风格沙发
    维多利亚风格咖啡桌
    """
    print("Client: Testing client code with the first factory type:")
    factory1 = ModernFactory()
    client_code(factory1)

    print()

    print("Client: Testing the same client code with the second factory type:")
    factory2 = VictorianFactory()
    client_code(factory2)

四、优缺点

优点

  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
  • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。

缺点

  • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

跳转主页:【Python笔记】设计模式-CSDN博客

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抽象工厂模式是一种创建型设计模式,它允许客户端通过接口创建一组相关或依赖对象的家族,而不需要指定它们的具体类。下面是Python抽象工厂模式的实现步骤和示例代码: 1.定义抽象工厂类,其中包含创建产品的抽象方法。 ```python class AbstractFactory: def create_product_a(self): pass def create_product_b(self): pass ``` 2.定义具体工厂类,实现抽象工厂类中的抽象方法,用于创建具体的产品。 ```python class ConcreteFactory1(AbstractFactory): def create_product_a(self): return ConcreteProductA1() def create_product_b(self): return ConcreteProductB1() class ConcreteFactory2(AbstractFactory): def create_product_a(self): return ConcreteProductA2() def create_product_b(self): return ConcreteProductB2() ``` 3.定义抽象产品类,其中包含产品的抽象方法。 ```python class AbstractProductA: def do_something(self): pass class AbstractProductB: def do_something(self): pass ``` 4.定义具体产品类,实现抽象产品类中的抽象方法。 ```python class ConcreteProductA1(AbstractProductA): def do_something(self): return "ConcreteProductA1" class ConcreteProductA2(AbstractProductA): def do_something(self): return "ConcreteProductA2" class ConcreteProductB1(AbstractProductB): def do_something(self): return "ConcreteProductB1" class ConcreteProductB2(AbstractProductB): def do_something(self): return "ConcreteProductB2" ``` 5.客户端使用抽象工厂类创建具体工厂类的实例,然后使用具体工厂类的实例创建具体产品类的实例。 ```python factory1 = ConcreteFactory1() product_a1 = factory1.create_product_a() product_b1 = factory1.create_product_b() factory2 = ConcreteFactory2() product_a2 = factory2.create_product_a() product_b2 = factory2.create_product_b() ``` 输出结果: ```python print(product_a1.do_something()) # 输出:ConcreteProductA1 print(product_b1.do_something()) # 输出:ConcreteProductB1 print(product_a2.do_something()) # 输出:ConcreteProductA2 print(product_b2.do_something()) # 输出:ConcreteProductB2 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值