四大金刚并没有把将简单工厂视为一种设计模式。
我们不妨视其为一个独立的模式,因为对它的理解有助于理解其他创建型模式。
故事
1990年。
王四是一个手艺不错的木匠,王村及附近村很多人家的家具都是他打造的。
每当有人家想做新家具时,就自备材料(主人想省钱),把王四喊到自己家来做,每餐好酒好菜招待着。
有时王四和主人家都觉得这样有点麻烦:
有时主人家钉子不够使,得要主人去买。
有时主人家备的材料不堪用,得让主人去换。
主人也觉得招待饭菜影响他干其他农活。
王四在主人家做家具是按工日收费的。叫王四做家具的人不少,但奈何他挣得也不多,毕竟一年干活最多也就300来天。他发现别人叫他做的最多的家具就是桌椅,就想:我何不就在自己家里只做桌椅,谁家需要做桌椅,到我这里买做好的桌椅就行了。
他算过了,这么搞,他可以挣更多,自己批量采购材料,批量制作桌椅,成本比较低嘛!还有,在家里做就可以购置一些机器,这样干活也会快很多。另外还能顾着家,免得村里单身汉来骚扰他的漂亮老婆。
于是王四就把自己家捯饬一下,搞了一个专做桌椅的小作坊。
结果很好:
1)原来要喊王四去自己家做桌椅的改来王四家买桌椅了,质量不打折,但花的钱更少,还省了好多麻烦。
2)老王能做更多的桌椅,挣的更多了,而且那些单身汉也不敢来自己家了。
3)附近村也听闻了王四的小作坊,做的桌椅又好又便宜,都来找他买。甚至生意太好,还要提前给钱预定。
王四的作坊就是使用了简单工厂模式。
问题
| 故事 | 抽象 |
|---|---|
| 制作家具与客户打交道太多,有很多烦恼。 | 产品的创建与客户代码耦合。 |
解决方法
| 故事 | 抽象 |
|---|---|
| 在自己的作坊中制作家具,减少与客户打交道,更方便,效率更高,挣了更多的钱。 | 用工厂统一创建产品,与客户代码解耦,方便维护。 |
要点
对产品的创建过程进行封装,使得产品使用者不受产品创建过程的影响(主人不用跑腿买钉子或换材料)。
代码实现
示例代码:
from __future__ import annotations
class Table:
name: str = 'Chair'
def used_by_person(self):
print(f"{self.name} is used by person")
class Chair:
name: str = 'Chair'
def sat_by_person(self):
print(f"{self.name} is sat by person")
class FurnitureSimpleFactory:
name: str = "WangSi's furniture workshop"
def create_table(self) -> Table:
table = Table()
print(f"A table is created in {self.name}")
return table
def create_chair(self) -> Chair:
chair = Chair()
print(f"A chair is created in {self.name}")
return chair
def client_code(factory: FurnitureSimpleFactory) -> None:
"""
客户代码:不知道产品具体是如何创建的。
"""
table = factory.create_table()
table.used_by_person()
chair = factory.create_chair()
chair.sat_by_person()
if __name__ == "__main__":
client_code(FurnitureSimpleFactory())
输出:
A table is created in WangSi's furniture workshop
Chair is used by person
A chair is created in WangSi's furniture workshop
Chair is sat by person