# 工廠模式設計(創建型模式) - 簡單工廠 - 工廠方法 - 抽象工廠 如有錯誤歡迎糾正,小弟正在學習中 ## 簡單工廠(靜態工廠) 在可提取共通邏輯進行抽象,並封裝且隱藏實作細節,常運用在初期系統開發以及產品數量較少且變化不頻繁的場景 - 工廠類提供靜態方法來選擇要建立的實例 - 根據參數透過工廠來建立實例 - 有些書歸類為是程式上的風格不一定歸納為設計 今天啊浩去三媽臭臭鍋吃飯,然後看到了三媽的飲料機,而飲料機比喻為工廠,提供了可樂,雪碧,檸檬紅茶,三種飲料,基底都是水,外部透過參數選擇要建立的飲料,並流出來 水為抽象類(基類) - 可樂 - 雪碧 - 檸檬紅茶 飲料則定了三個class,各自實作飲料,雖然現實中飲料機是直接現成飲料倒進去XD,我們想像飲料機有了水只要加上飲料的原料就能生產飲料出來 > 💡無需傳遞實例變量、無需實例,簡單工程又稱靜態工廠 ### UML 類圖 ![簡單工廠類圖](https://hackmd.io/_uploads/ByE0xNcO0.png) ### 特性 - 無需關注與理解工廠內部實作,只需傳遞參數建立實例 - 建立職責區分開 - 在業務需求不變下只需繼承base class就能快速創建新需求 ### 場景 ``` python from abc import ABC, abstractmethod from enum import Enum class ShapeEnum(Enum): square = 'square' triangle = 'triangle' class Shape(ABC): @abstractmethod def draw(self): pass class Square(Shape): def draw(self): print('draw Square') class Triangle(Shape): def draw(self): print('draw Triangle') class ShapeFactory: @staticmethod def create_shape(select: ShapeEnum): if select == ShapeEnum.square: return Square() if select == ShapeEnum.triangle: return Triangle() def main(): shape_factory = ShapeFactory() triangle = shape_factory.create_shape(select=ShapeEnum.triangle) triangle.draw() square = shape_factory.create_shape(select=ShapeEnum.square) square.draw() if __name__ == "__main__": main() ``` ## 設計問題 ### 高耦合與違反開閉原則 今天突然收到需求要新增新增start形狀時,此設計需要做什麼? - 對內部新增class - 針對factory class做修改 上述違反了開閉原則的不修改情況下更改行為,且高耦合對擴展不夠開放。 > 💡何謂開閉原則(OCP)? 「軟體中的對象應該對於擴展是開放的,但是對於修改是封閉的」,一個實體是允許在不改變它的原始碼的前提下變更它的行為。 ## 解決設計 - 工廠方法設計模式 - 抽象工廠設計模式