[创建型]抽象工厂模式

252 阅读3分钟

故事

根据市场调查,桌椅沙发的需求量非常大。经过进一步分析,中式风格和现代风格最受消费者青睐。

于是王四决定,扩大产品线,扩大产能。

王四已经有两个使用了工厂方法模式的生产桌椅的车间了,显然不能满足扩大产品线的需要。如果继续用这两个车间生产(工厂方法模式玩不转了),免不了对车间做一大番改造,而且两种风格的家具挤在一起制造,容易出乱子。

王四决定盖新厂,新厂划分成两个分厂,一个生产中式风格家具,一个生产现代风格家具。这两个分厂也都遵循同样的生产规范,而且每种家具(比如中式风格桌椅和现代风格桌椅)也都是遵循同样的生产规范,这样才方便王四管理。

查看源图像

graph LR
家具厂["王四家具厂"]
家具厂---中式风格家具厂
家具厂---现代风格家具厂

中式风格家具厂---中式风格桌椅
中式风格家具厂---中式风格沙发
中式风格家具厂---中式风格木床


现代风格家具厂---现代风格桌椅
现代风格家具厂---现代风格沙发
现代风格家具厂---现代风格木床

问题

故事模式
需要生产多种风格桌椅、沙发和木床,将来可能还要支持更多风格。需要生产一系列不同风格的产品,将来可能还要更多风格的一系列产品。

解决方法

故事模式
制定统一的生产规范,在不同的工厂生产不同风格的多种家具。定义工厂抽象接口,为每种产品也定义抽象接口,在工厂接口声明创建各种产品的方法,在工厂实现类创建同一风格的各种产品。

要点

1)对工厂进行抽象,因为我们要办很多种类的工厂。

2)产品也是抽象的,不同的工厂生产的同类产品有”风格“差异,但接口是一样的。

3)抽象工厂考虑是如何标准化地创建一组相互配套的产品(即有多种产品)。

4)抽象工厂是对工厂方法的升级:它的精髓在于:不仅标准化产品的创建,而且考虑一组配套产品的整合

5)整合的目的可能是为了:效率、复用、兼容。

模式适用场景

  • 如果你要创建相同用途,不同风格的一系列产品(产品族),抽象工厂模式特别适用。

代码实现

from __future__ import annotations
from abc import ABC, abstractmethod


class TableSuite(ABC):
    """
    抽象产品类——桌椅套装
    """

    @abstractmethod
    def perform_function(self) -> str:
        """发挥功能"""
        pass


class Sofa(ABC):
    """
    抽象产品类——沙发
    """

    @abstractmethod
    def perform_function(self) -> str:
        """发挥功能"""
        pass


class AbstractFurnitureFactory(ABC):
    @abstractmethod
    def create_table_suite(self) -> TableSuite:
        """
        生产桌椅套装
        """
        pass

    @abstractmethod
    def create_sofa(self) -> Sofa:
        """生产沙发"""
        pass


class ChineseFurnitureFactory(AbstractFurnitureFactory):
    """中式风格家具厂"""
    def create_table_suite(self) -> TableSuite:
        return ChineseTableSuite()

    def create_sofa(self) -> Sofa:
        return ChineseSofa()


class ModernFurnitureFactory(AbstractFurnitureFactory):
    """现代风格家具厂"""
    def create_table_suite(self) -> TableSuite:
        return ModernTableSuite()

    def create_sofa(self) -> Sofa:
        return ModernSofa()


class ChineseTableSuite(TableSuite):
    def perform_function(self) -> str:
        return "中式风格桌椅发挥功能。"


class ChineseSofa(Sofa):
    def perform_function(self) -> str:
        return "中式风格沙发发挥功能"


class ModernTableSuite(TableSuite):
    def perform_function(self) -> str:
        return "现代风格桌椅发挥功能。"


class ModernSofa(Sofa):
    def perform_function(self) -> str:
        return "现代风格沙发发挥功能"


def client_code(factory: AbstractFurnitureFactory) -> None:
    table_suite = factory.create_table_suite()
    sofa = factory.create_sofa()

    print(f"{table_suite.perform_function()}")
    print(f"{sofa.perform_function()}")


if __name__ == "__main__":
    print("客户代码: 使用中式风格家具厂生产家具")
    client_code(ChineseFurnitureFactory())

    print("\n")

    print("客户代码: 使用现代风格家具厂生产家具")
    client_code(ModernFurnitureFactory())

运行结果:

客户代码: 使用中式风格家具厂生产家具
中式风格桌椅发挥功能。
中式风格沙发发挥功能


客户代码: 使用现代风格家具厂生产家具
现代风格桌椅发挥功能。
现代风格沙发发挥功能