簡(jiǎn)介:簡(jiǎn)單工廠模式(Simple Factory Pattern):又稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。
模式結(jié)構(gòu)
- Factory:工廠角色
- Product:抽象產(chǎn)品角色
- ConcreateProduct:具體產(chǎn)品角色
特性
? 簡(jiǎn)單工廠模式專門定義一個(gè)類來(lái)負(fù)責(zé)查創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。將對(duì)象的創(chuàng)建和對(duì)象業(yè)務(wù)處理分離可以降低系統(tǒng)的耦合度,使得兩者修改起來(lái)都相對(duì)容易。由于工廠方法是靜態(tài)方法,使用起來(lái)很方便,可通過(guò)類名直接調(diào)用,而且只需要傳入一個(gè)簡(jiǎn)單的參數(shù)即可。簡(jiǎn)單工廠模式的要點(diǎn)在于:當(dāng)你需要什么,只需要傳入正確的參數(shù),就可以獲取你所需要的對(duì)象,而無(wú)須知道其創(chuàng)建細(xì)節(jié)。但是,其最大的問(wèn)題在于工廠類的職責(zé)相對(duì)過(guò)重,增加新的產(chǎn)品需要修改工廠類的判斷邏輯,這一點(diǎn)與開(kāi)閉原則相違背。
優(yōu)點(diǎn)
- 工廠類含有必要的判斷邏輯,客戶端無(wú)需知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體長(zhǎng)跑類所對(duì)應(yīng)的參數(shù)即可,減少使用者的記憶量。
- 通過(guò)引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,一定程度上提高了系統(tǒng)的靈活性。
缺點(diǎn)
- 由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響。
- 簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中類的個(gè)數(shù),在一定程度上增加了系統(tǒng)的復(fù)雜度和理解難度。
- 系統(tǒng)擴(kuò)展難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí),有可能造成工廠邏輯過(guò)于復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
- 簡(jiǎn)單工廠模式猶豫使用了靜態(tài)工廠方法,造成工廠角色無(wú)法形成基于繼承的登記結(jié)構(gòu)
應(yīng)用場(chǎng)景
- 工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少:由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯過(guò)于復(fù)雜。
- 客戶端只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象不關(guān)心。
代碼示例
現(xiàn)在有一個(gè)工人,他的工作是砍樹(shù),工具為花崗巖石斧和鐵斧,不同的環(huán)境:現(xiàn)代社會(huì)與原始社會(huì)。
class Person(object):
def __init__(self,name):
self.name = name
def work(self):
axe1 = StoneAxe("花崗巖石斧")
axe2 = SteelAxe("鐵斧頭")
axe1.cutTree()
axe2.cutTree()
class Axe(object):
def __init__(self,name):
self.name = name
def cutTree(self):
print("%s斧頭砍樹(shù)"%self.name)
class StoneAxe(Axe):
def cutTree(self):
print("使用%s開(kāi)始砍樹(shù)"%self.name)
class SteelAxe(Axe):
def cutTree(self):
print("使用%s開(kāi)始砍樹(shù)"%self.name)
p1 = Person("lili")
p1.work()
以上代碼的問(wèn)題:
- 直接在work下創(chuàng)建斧頭
- 人與斧頭的耦合性強(qiáng),相當(dāng)于現(xiàn)在我們需要自己根據(jù)不同的需求去創(chuàng)建不同的斧頭
- 我們使用不同的斧頭需要修改work下的代碼
- 依賴性太強(qiáng)
解決問(wèn)題:
class Axe(object):
def __init__(self,name):
self.name = name
def cutTree(self):
print("%s斧頭砍樹(shù)"%self.name)
class StoneAxe(Axe):
def cutTree(self):
print("%s斧頭開(kāi)始砍樹(shù)"%self.name)
class SteelAxe(Axe):
def cutTree(self):
print("%s斧頭開(kāi)始砍樹(shù)"%self.name)
class Factory(object):
@staticmethod
def createAxe(type):
if type == "Stone":
axe = StoneAxe("花崗巖斧頭")
return axe
elif type == "Steel":
axe = SteelAxe("鐵斧頭")
return axe
else:
print("輸入類型錯(cuò)誤,沒(méi)有此類型的斧頭")
class Person(object):
def __init__(self,name):
self.name = name
def work(self,axe,type):
axe = Factory.createAxe(type)
axe.cutTree()
p1 = Person("lilei")
p1.work()
總結(jié)
簡(jiǎn)單工廠模式的要點(diǎn)在于:當(dāng)你需要什么,只需要傳入正確的參數(shù),就能得到你所需要的對(duì)象,而無(wú)須知道其創(chuàng)建的細(xì)節(jié)。其最大的優(yōu)點(diǎn)在于實(shí)現(xiàn)對(duì)象創(chuàng)建和對(duì)象使用分離,將對(duì)象的創(chuàng)建交給專門的工廠類負(fù)責(zé)。但是其最大的缺點(diǎn)增加新的具體產(chǎn)品需要修改工廠類的業(yè)務(wù)判斷邏輯,而且產(chǎn)品較多時(shí),工廠類方法過(guò)于復(fù)雜。
每天多努力那么一點(diǎn)點(diǎn),積少成多