1. 程式人生 > 實用技巧 >常見的設計模式(python)———工廠模式

常見的設計模式(python)———工廠模式

原始碼前戲

承接上一篇(建造者模式)故事,話說,女媧正在造人,但是效率低下(畢竟神仙也只有一雙手)

於是偉大的女媧think了一下,何不建造一個造人工廠,

說幹就幹,上原始碼:

造人工廠v1.0 ----簡單工廠

"""簡單工廠模式"""
class MakeWoman:
    # 製造女人
    """製造女人的具體實現"""

    def __init__(self, name):
        print("製造女人:" + name)

    ...


class MakeMan:
    def __init__(self, name):
        print("
製造男人:" + name) class KeyError(Exception): """自定義異常""" def __init__(self, code, massage): self.code = code self.massage = massage class WomanGod: """統一介面""" @staticmethod def person(sex, name): try: if sex == "": MakeWoman(name)
elif sex == "": MakeMan(name) else: raise KeyError(0, "性別有問題") except KeyError as e: print(e.massage) if __name__ == "__main__": WomanGod.person("", "張三") WomanGod.person("", "王二妹") """ps:簡單工廠模式適用於需建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜的情況下,而且使用者只關心那種型別的例項被建立,
並不關心其初始化過程時,比如多種資料庫(MySQL/MongoDB)的例項,多種格式檔案的解析器(XML/JSON)等。
"""

現在好了,女媧只需要給每個人取名字,性別就行了...

in on time,問題出現了,由於長時間的給人類物件取名、性別,女媧感到無比的繁瑣,枯燥,於是

何不改造一下,先造人,暫不取名,直接調方法

上程式碼

造人工廠v2.0 ----工廠方法模式

from abc import abstractmethod, ABCMeta


class MakeMan:
    def __str__(self):
        return "製造女人"


class MakeWoman:
    def __str__(self):
        return "製造男人"


class Person(metaclass=ABCMeta):
    @abstractmethod
    def make_something(self):
        print("抽象類")


# class WomanGod:
#     def make_woman(self):
#         return MakeWoman()
#
#     def make_man(self):
#         return MakeMan()
class Woman(Person):
    def make_something(self):
        # super().make_something()
        return MakeWoman()


class Man(Person):
    def make_something(self):
        return MakeMan()


if __name__ == "__main__":
    print(Woman().make_something())

"""工廠方法模式 繼承了簡單工廠模式的優點又有所改進,其不再通過一個工廠類來負責所有產品的建立,
而是將具體建立工作交給相應的子類去做,這使得工廠方法模式可以允許系統能夠更高效的擴充套件。實際應用中可以用來實現系統的日誌系統等,
比如具體的程式執行日誌,網路日誌,資料庫日誌等都可以用具體的工廠類來建立。。
"""

其他

"""
除了 簡單工廠模式,工廠方法模式 還有一個叫抽象工廠模式
由於其與女媧故事線有偏差(其實是編不想去了),這裡就做個索引

解釋一下:
抽象工廠模式與工廠方法模式最大的區別在於,
抽象工廠中的一個工廠物件可以負責多個不同產品物件的建立 ,
這樣比工廠方法模式更為簡單、有效率。

ps:抽象工廠模式在工廠方法基礎上擴充套件了工廠對多個產品建立的支援,
更適合一些大型系統,比如系統中有多於一個的產品族,
且這些產品族類的產品需實現同樣的介面,
像很多軟體系統介面中不同主題下不同的按鈕、文字框、字型等等。
"""

最後

分享不宜,不喜勿噴,錯誤之處,歡迎指出,一起學習

故事線純屬瞎編,如有雷同,純屬巧合....