python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点
前言
在《設計模式》一書中工廠模式提到了:
工廠方法模式(Factory Method)
抽象工廠模式 (Abstract Factory)
但是在實際過程中還有一種工廠模式經(jīng)常被使用,那就是 簡單工廠模式(Simple
Factory)。有一種常見的分類的方法:根據(jù)產(chǎn)品是由具體產(chǎn)品還是具體工廠可以分為 工廠方法模式 和 簡單工廠模式;根據(jù)工廠的抽象程度可以分為
工廠方法模式 和 抽象工廠模式。接下來會通過例子對比簡單工廠模式和工廠方法模式。
工廠意圖
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
別名
虛構造器(Virtual Constructor)
案例
第一階段
小李開了一個代工廠,專門幫各大廠商生產(chǎn)手機,一開始只有小米找他生產(chǎn)小米手機(MiPhone),后來質(zhì)量過硬,聲名遠播,蘋果公司也找上門了,準備讓他生產(chǎn)蘋果手機,生意來了,小李小手一揮,停工幾個月,加了一個生產(chǎn)線專門生成蘋果手機(Iphone)。于是乎,現(xiàn)在一個工廠有兩個生產(chǎn)線。
第一階段 UML 圖
讓我們借助 UML 圖直觀了解一下工廠現(xiàn)在的樣子。
第一階段代碼
通過代碼去實現(xiàn)這個邏輯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35from abcimport ABC, abstractmethod
# 手機
class Phone(ABC):
@abstractmethod
def make(self):
pass
# 蘋果手機
class Apple(Phone):
def make(self):
print("make apple")
# 小米手機
class XiaoMi(Phone):
def make(self):
print("make xiaomi")
class Factory:
def product_phone(self, mobile_type):
if mobile_type== 'apple':
return Apple()
else:
return XiaoMi()
if __name__== '__main__':
factory= Factory()
factory.product_phone('apple').make()
factory.product_phone('xiaomi').make()
看一下運行結果:
make apple
make xiaomi
第二階段
隨著第一階段的訂單完成,現(xiàn)在越來越多的手機廠商來找小李來生產(chǎn)手機,問題來了,生產(chǎn)線改造需要導致整個工廠停工一段時間,每次停工對工廠來說都是巨大的損失。那么該怎么解決問題呢?一個工廠似乎不夠用了,那么該怎么解決呢?
把所有的生產(chǎn)線獨立出來到單獨的工廠,這樣子需要生產(chǎn)新的手機只需要新增新的工廠就好了,不會影響其他的手機的生產(chǎn)。
第二階段 UML 圖
同樣讓我們借助 UML 圖了解一下這個階段工廠的樣子吧。
第二階段代碼
同樣讓我們借助代碼去實現(xiàn)這一階段的邏輯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49from abcimport ABC, abstractmethod
# 抽象工廠
class AbastractFactory(ABC):
@abstractmethod
def product_phone(self):
pass
# 蘋果工廠
class AppleFactory(AbastractFactory):
def product_phone(self):
return Apple().make()
# 小米工廠
class XiaomiFactory(AbastractFactory):
def product_phone(self):
return XiaoMi().make()
# 生產(chǎn)線
class Phone(ABC):
@abstractmethod
def make(self):
pass
# 蘋果生產(chǎn)線
class Apple(Phone):
def make(self):
print("make apple")
# 小米生產(chǎn)線
class XiaoMi(Phone):
def make(self):
print("make xiaomi")
def client_product(factory:AbastractFactory):
return factory
if __name__== '__main__':
xiaomi= client_product(XiaomiFactory())
xiaomi.product_phone()
apple= client_product(AppleFactory())
apple.product_phone()
看一下運行結果:
make xiaomi
make apple
總結
上面的案例中的倆個階段分別對應了兩個設計模式,分別是:**簡單工廠模式 **和 工廠方法模式。通過案例和對比,我們不難發(fā)現(xiàn)它們的的優(yōu)缺點。
簡單工廠模式優(yōu)缺點
優(yōu)點:客戶端與產(chǎn)品的創(chuàng)建分離,客戶端不需要知道產(chǎn)品創(chuàng)建的邏輯,只需要消費該產(chǎn)品即可。
缺點:工廠類集成了所有產(chǎn)品的創(chuàng)建邏輯,當工廠類出現(xiàn)問題,所有產(chǎn)品都會出現(xiàn)問題;還有當新增加產(chǎn)品都會修改工廠類,違背開閉原則
工廠方法模式優(yōu)缺點
優(yōu)點:更符合開閉原則,增加一個產(chǎn)品類,則只需要實現(xiàn)其他具體的產(chǎn)品類和具體的工廠類即可;符合單一職責原則,每個工廠只負責生產(chǎn)對應的產(chǎn)品
缺點:增加一個產(chǎn)品,就需要實現(xiàn)對應的具體工廠類和具體產(chǎn)品類;每個產(chǎn)品需要有對應的具體工廠和具體產(chǎn)品類
總結
以上是生活随笔為你收集整理的python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旅游流的概念_2020年去张家界凤凰古城
- 下一篇: android 集成同一interfac