簡單工廠模式(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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。