[创建型]简单工厂模式

126 阅读3分钟

四大金刚并没有把将简单工厂视为一种设计模式。

我们不妨视其为一个独立的模式,因为对它的理解有助于理解其他创建型模式。

故事

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