故事
根据市场调查,桌椅、沙发的需求量非常大。经过进一步分析,中式风格和现代风格最受消费者青睐。
于是王四决定,扩大产品线,扩大产能。
王四已经有两个使用了工厂方法模式的生产桌椅的车间了,显然不能满足扩大产品线的需要。如果继续用这两个车间生产(工厂方法模式玩不转了),免不了对车间做一大番改造,而且两种风格的家具挤在一起制造,容易出乱子。
王四决定盖新厂,新厂划分成两个分厂,一个生产中式风格家具,一个生产现代风格家具。这两个分厂也都遵循同样的生产规范,而且每种家具(比如中式风格桌椅和现代风格桌椅)也都是遵循同样的生产规范,这样才方便王四管理。
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())
运行结果:
客户代码: 使用中式风格家具厂生产家具
中式风格桌椅发挥功能。
中式风格沙发发挥功能
客户代码: 使用现代风格家具厂生产家具
现代风格桌椅发挥功能。
现代风格沙发发挥功能