簡單工廠模式(python版)

2021-08-31 16:27:10 字數 4602 閱讀 9661

工廠模式有一種非常形象的描述,建立物件的類就如乙個工廠,而需要被建立的物件就是乙個個產品;在工廠中加工產品,使用產品的人,不用在乎產品是如何生產出來的。從軟體開發的角度來說,這樣就有效的降低了模組之間的耦合。

簡單工廠的作用是例項化物件,而不需要客戶了解這個物件屬於哪個具體的子類。簡單工廠例項化的類具有相同的介面或者基類,在子模擬較固定並不需要擴充套件時,可以使用簡單工廠。如資料庫生產工廠就是簡單工廠的乙個應用

採用簡單工廠的優點是可以使使用者根據引數獲得對應的類例項,避免了直接例項化類,降低了耦合性;缺點是可例項化的型別在編譯期間已經被確定,如果增加新類 型,則需要修改工廠,不符合ocp(開閉原則)的原則。簡單工廠需要知道所有要生成的型別,當子類過多或者子類層次過多時不適合使用。

下面考慮《大話設計模式》中的乙個例子:

題目:用任意一種物件導向語言實現乙個計算器控制台程式。要求輸入兩個數和運算符號,得到結果。

題目分析:

程式應該做到:(1)可維護;(2)可復用;(3)可擴充套件;(4)靈活性好。

可維護:就是說**一處更改,不能產生連鎖反應,不能影響其他地方。

可復用:儘量減少重複性**。

可擴充套件:如果要擴充套件新的功能、新的業務,則只需要增加新的類就好了,不對已有的類和邏輯產生影響。插拔式的應用。

物件導向要點:

物件導向三大特性:封裝、繼承、多型。

通過封裝、繼承、多型把程式耦合降低。

業務邏輯和介面邏輯分開。

類的結構圖:

**實現:

1. 首先,搞清楚業務中容易發生變化的部分。在本應用中,要求計算兩個數的運算結果,那麼要進行什麼樣的運算,這就是乙個容易發生變化的部分。例如,我們現在只想實現加減乘除運算,後期又想增加開根或者求餘運算。那麼如何應對這種需求帶來的變化。在程式設計的時候就應該考慮到程式的可維護性、可擴充套件性、**的可復用性、靈活性等等。

2. 例如現在這個運算器只有加減乘除四種運算。首先建乙個operation類,這個類是各種具體運算類(加減乘除)的父類,主要是接受使用者輸入的數值。該類如下:

class operation():

def __init__(self,numbera=0,numberb=0):

self.numbera = numbera

self.numberb = numberb

def getresult(self):

pass

3. 然後是具體的運算類:add、sub、mul、div。他們都繼承了operation類,並且重寫了getresult()方法。這樣就可以用多型性降低不同業務邏輯的耦合度,修改任何一種運算類都不會影響其他的運算類。具體類的**如下:

class addop(operation):

def getresult(self):

return self.numberb + self.numbera

class minusop(operation):

def getresult(self):

return self.numbera - self.numberb

class multiop(operation):

def getresult(self):

return self.numbera * self.numberb

class divideop(operation):

def getresult(self):

try:

return 1.0*self.numbera / self.numberb

except zerodivisionerror:

raise

4.  那麼如何讓計算器知道我是要用哪一種運算呢?也就是說到底要例項化哪乙個具體的運算類,add?sub?mul?div?這時就應該考慮用 乙個單獨的類來做這個創造具體例項的過程,這個類就是工廠類。如下:

class operationfatory():

def chooseoperation(self,op):

if op == '+':

return addop()

if op == '-':

return minusop()

if op == '*':

return multiop()

if op == '/':

return divideop()

5. 這樣,使用者只要輸入運算子,工廠類就可以建立合適的例項,通過多型性,即返回給父類的方式實現運算結果。客戶端**如下:

if __name__ == '__main__':

ch = ''

while not ch=='q': 

numbera = eval(raw_input('please input number1:  '))

op = str(raw_input('please input the operation:  '))

numberb = eval(raw_input('please input number2:  '))

opfactory = operationfatory()

optype = opfactory.chooseoperation(op)

optype.numbera = numbera

optype.numberb = numberb

print 'the result is:',optype.getresult()

print '\n#--  input q to exit any key to continue'

try:

ch = str(raw_input())

except:

ch = ''

完整版**如下:

# -*-coding:utf-8-*-  

from abc import abcmeta,abstractmethod

class operation():

def __init__(self,numbera=0,numberb=0):

self.numbera = numbera

self.numberb = numberb

def getresult(self):

pass

class addop(operation):

def getresult(self):

return self.numberb + self.numbera

class minusop(operation):

def getresult(self):

return self.numbera - self.numberb

class multiop(operation):

def getresult(self):

return self.numbera * self.numberb

class divideop(operation):

def getresult(self):

try:

return 1.0*self.numbera / self.numberb

except zerodivisionerror:

raise

class operationfatory():

def chooseoperation(self,op):

if op == '+':

return addop()

if op == '-':

return minusop()

if op == '*':

return multiop()

if op == '/':

return divideop()

if __name__ == '__main__':

ch = ''

while not ch=='q': 

numbera = eval(raw_input('please input number1:  '))

op = str(raw_input('please input the operation:  '))

numberb = eval(raw_input('please input number2:  '))

opfactory = operationfatory()

optype = opfactory.chooseoperation(op)

optype.numbera = numbera

optype.numberb = numberb

print 'the result is:',optype.getresult()

print '\n#--  input q to exit any key to continue'

try:

ch = str(raw_input())

except:

ch = ''

簡單工廠模式 Python版

簡單工廠模式 簡單工廠模式,提供乙個建立物件例項的功能,而無需關心其具體實現,屬於建立型模式。適合對大量具有相同介面的類進行例項化,推遲到執行的時候才決定要建立哪個類的例項。簡單工程的本質是選擇實現。寫乙個計算器控制台程式,要求輸入兩個數和運算符號,得到結果。理由 加減乘除法的都是對兩個數進行運算,...

Python簡單工廠模式

簡單工廠屬於類的創新性模式,又叫靜態工廠方法模式。是專門通過定義乙個類來負責建立其他類的例項,被建立的例項通常都具有相同的父類。模式特點 工廠工具條件產生不同功能的類。簡單工廠的組成要素 負責具體產品物件的建立工作,是該模式的核心。當場景比較負責的時候,可能需要 乙個工廠類來負責產品的建立。以及產品...

python簡單工廠模式

簡單工廠模式相當於是乙個4s店中有各種汽車,建立在乙個類中,客戶無需知道具體汽車型號,只需要知道汽車類所對應的引數即可。但是工廠的職責過重,而且當型別過多時不利於系統的擴充套件維護。現代汽車4s店類 class carstore object 示例方法 建立工廠返回工廠物件引用 def init s...