設計模式Python實現-簡單工廠模式


簡單工廠模式(Simple Factory Pattern):是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類.

簡單工廠模式結構

 

 

Product 產品聲明接口,創建者及其子類生成的所有對象都通用

Concrete ProductA/B是產品接口的不同實現

Creator 創建者聲明工廠方法,此方法返回的類型必須與產品接口匹配,可以將工廠方法聲明為抽象方法,強制其子類必須實現自己的方法

ConcreteCreatorA/B 重寫工廠方法,以便返回不同的產品

 

 

 

 1 from __future__ import annotations
 2 from abc import ABC, abstractmethod
 3 
 4 
 5 class Creator(ABC):
 6     """
 7     Creator類聲明應該返回產品類的對象的工廠方法。創建者的子類通常提供此方法的實現。使用abstractmethod方式,強制子類必須實現factory_method
 8     """
 9 
10     @abstractmethod
11     def factory_method(self):
12         """
13         創建者可以提供factory方法的一些默認實現。
14         """
15         pass
16 
17     def some_operation(self) -> str:
18         """
19         不關心是誰創建的產品,寫了自己的業務,子類可以重寫
20         """
21 
22         # 調用工廠方法,創建一個產品
23         product = self.factory_method()
24 
25         # 使用產品,不關心產品類型
26         result = f"創建者不關心產品類型, {product.operation()}"
27 
28         return result
29 
30 
31 
32 """
33 具體的創建者重寫工廠方法以更改結果產品的類型。
34 """
35 
36 
37 class ConcreteCreator1(Creator):
38     """
39     具體的生產者重寫工廠方法以生產自己的產品。
40     具體產品實際上是從該方法返回的
41     """
42 
43     def factory_method(self) -> ConcreteProduct1:
44         return ConcreteProduct1()
45 
46 
47 class ConcreteCreator2(Creator):
48     def factory_method(self) -> ConcreteProduct2:
49         return ConcreteProduct2()
50 
51 
52 class Product(ABC):
53     """
54     產品接口聲明所有具體產品必須實現的操作。abstractmethod強制子類實現其裝飾的方法
55     """
56 
57     @abstractmethod
58     def operation(self) -> str:
59         pass
60 
61 
62 """
63 具體的產品提供了產品接口的各種實現。
64 """
65 
66 
67 class ConcreteProduct1(Product):
68     def operation(self) -> str:
69         return "{Result from ConcreteProduct1}"
70 
71 
72 class ConcreteProduct2(Product):
73     def operation(self) -> str:
74         return "{Result from ConcreteProduct2}"
75 
76 
77 def client_code(creator: Creator) -> None:
78     """
79     客戶端和具體生產者綁定,就可以獲得不同的產品,不用關心具體的創建者是誰
80     """
81 
82     print(f"client_code不在乎具體創建者\n"
83           f"{creator.some_operation()}", end="")
84 
85 
86 if __name__ == "__main__":
87     print("ConcreteCreator1")
88     client_code(ConcreteCreator1())
89     print("\n")
90 
91     print("ConcreteCreator2")
92     client_code(ConcreteCreator2())

 

 

 

 

 

Product 產品聲明接口,創建者及其子類生成的所有對象都通用

Concrete ProductA/B是產品接口的不同實現

Creator 創建者聲明工廠方法,此方法返回的類型必須與產品接口匹配,可以將工廠方法聲明為抽象方法,強制其子類必須實現自己的方法

ConcreteCreatorA/B 重寫工廠方法,以便返回不同的產品

 

有哪些場景適合簡單工廠模式呢?

在處理大型的資源密集型對象(例如數據庫連接,文件系統和網絡資源)時

事先不知道代碼應使用的對象的確切類型和依賴關系時

要為庫或框架的用戶提供擴展其內部組件的方法時

想通過重用現有對象而不是每次都重建它們來節省系統資源時

 

優缺點:

優點:

可以避免創建者與具體產品之間的緊密耦合。

符合單一責任原則

符合開放/封閉原則,不破壞現有客戶端代碼,從而增加產品

缺點:

引入許多新的子類來實現該模式,因此代碼可能變得更加復雜

 


作者:Andy
出處:http://www.cnblogs.com/onepiece-andy/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM