工廠方法與抽象工廠是否傻傻分不清,力求以最簡單和最直接的方式來了解模式設計,畢竟模式的初衷是化繁為簡,就該用最簡單的方式來了解。
示例code:
工廠模式
# -*- coding:utf-8 -*-
class A:
def __init__(self):
self.word = "運作A"
def run(self):
print(self.word)
class B:
def __init__(self):
self.word = "運作B"
def run(self):
print(self.word)
def Interface(classname):
"""
工廠模式接口函數
:param classname:
:return:
"""
run = dict(A=A, B=B)
return run[classname]()
if __name__ == '__main__':
test1 = Interface('A')
test1.run()
test2 = Interface('B')
test2.run()
結果:
運作A
運作B
抽象工廠模式:
# -*- coding:utf-8 -*-
class A:
def __init__(self):
self.word = "運作A"
def run(self):
print(self.word)
class B:
def __init__(self):
self.word = "運作B"
def run(self):
print(self.word)
class Interface:
"""
抽象工廠模式接口類
:param classname:
:return:
"""
def __init__(self, classname=None):
self.test = classname
def run(self):
self.test().run()
if __name__ == '__main__':
test1 = Interface()
test1.test = A
test1.run()
test1.test = B
test1.run()
結果:
運作A
運作B
抽象工廠:建立一系列相關或互相依賴抽象出來的的對象接口Interface,不需要具體指明執行個體化A類或B類
工廠方法:定義一個用于建立對象的接口函數Interface,讓子類決定執行個體化哪一個類A或者B
抽象工廠、工廠方法異同比較:抽象工廠執行個體化的類在接口方法裡已經通過字典方式例舉出來了,也就是不是執行個體化A就是B,但是抽象工廠執行個體化的類未知,可以在抽象接口類裡傳入A或者B,也可以建立一個C類傳入。
類本身就是對象的抽象,但是抽象工廠是對類的抽象,相同方法、相同屬性的歸并。
如上圖,抽象工廠有兩個方法生産車架和制造輪胎,但是他沒有指定是生産那種牌子的,上圖有兩種牌子:飛鴿自行車、永久自行車,也就可以增加一個鳳凰自行車等等。工廠模式裡面就指定了飛鴿廠和永久廠,并且這兩個廠隻能生産各自對應的輪胎。