一文詳解“工廠方法模式”以及python語言的實現
阿新 • • 發佈:2018-11-27
一、什麼是“工廠方法模式”——Factory_Method Pattern
概念解析:有的設計模式資料裡面,可能將“工廠方法模式”與上所講的“簡單工廠模式”混為一談,或者是將兩者的概念合併,本文還是將二者分開處理的。
工廠方法模式 是對簡單工廠模式的一個延伸,所以它們誕生的背景以及所解決的問題是大同小異的,本文就不再額外交代,不清楚的可以查閱另一片設計模式的文章。這樣說是因為簡單工廠違反了開放——封閉的原則,而此時工廠方法卻可以完美的解決這個問題!那它到底是怎麼解決的呢?
我們知道,工廠模式,只提供了一個工廠類,這個工廠類重定義一個建立型別的函式去建立每一種型別,如下所示:
但是“工廠方法模式”則是提供了一系列的工廠建立類,即每一種型別對應於一種工廠,但是這些工廠又遵循一個工廠介面,只不過是重新實現了介面中的建立方法,如下圖所示:
二、工廠方法模式的Python程式碼實現
import math #定義4個圖形類,並且每一個圖形都有一個可以計算面積的方法 class Circle: def Area(self,radius): return math.pow(radius,2)*math.pi class Rectangle: def Area(self,longth,width): return 2*longth*width class Triangle: def Area(self,baselong,height): return baselong*height/2 class Ellipse: def Area(self,long_a,short_b): return long_a*short_b*math.pi #================================= #定義建立物件的工廠介面,因為python中並沒有介面的概念,所以,這裡打算通過“類的繼承”加以實現 class IFactory: #模擬介面 def create_shape(self): #定義介面的方法,只提供方法的宣告,不提供方法的具體實現 pass class CircleFactory(IFactory): #模擬型別實現某一個介面,實際上是類的繼承 def create_shape(self, name): #重寫介面中的方法 if name =='Circle': return Circle() class RectangleFactory(IFactory): #模擬型別實現某一個介面,實際上是類的繼承 def create_shape(self, name): #重寫介面中的方法 if name =='Rectangle': return Rectangle() class TriangleFactory(IFactory): #模擬型別實現某一個介面,實際上是類的繼承 def create_shape(self, name): #重寫介面中的方法 if name =='Triangle': return Triangle() class EllipseFactory(IFactory): #模擬型別實現某一個介面,實際上是類的繼承 def create_shape(self, name): #重寫介面中的方法 if name =='Ellipse': return Ellipse() if __name__=='__main__': factory1=CircleFactory() factory2=RectangleFactory() factory3=TriangleFactory() factory4=EllipseFactory() circle=factory1.create_shape('Circle') circle_area=circle.Area(2) print(f'這是一個圓,它的面積是:{circle_area}') rectangle=factory2.create_shape('Rectangle') rectangle_area=rectangle.Area(2,3) print(f'這是一個長方形,它的面積是:{rectangle_area}') triangle=factory3.create_shape('Triangle') triangle_area=triangle.Area(2,3) print(f'這是一個三角形,它的面積是:{triangle_area}') ellipse=factory4.create_shape('Ellipse') ellipse_area=ellipse.Area(3,2) print(f'這是一個橢圓,它的面積是:{ellipse_area}')
上面的執行結果如下:
這是一個圓,它的面積是:12.566370614359172
這是一個長方形,它的面積是:12
這是一個三角形,它的面積是:3.0
這是一個橢圓,它的面積是:18.84955592153876
三、工廠方法函式的優缺點總結
優點:
(1)工廠方法模式具有簡單工廠模式的優點,那就是使用者不需要知道建立某一個型別的細節,即隱藏了程式碼的“建立邏輯”
(2)在增加一個新的圖形類的時候,比如再加一個平行四邊形,我不用去修改程式碼,只需要增加對應的平行四邊形工廠就好,完全符合開放——封閉性原則! 自己新增一個平行四邊形工廠類,只要讓其實現抽象的工廠介面就可以啦,即只需要自己編寫拓展模組,而不用更改原來的程式碼。這完美的體現了多型性!
缺點:
(1)在增加新的一個型別時,也必須增加相應的新的工廠類,會帶來額外的開銷,會導致很多的工廠類,影響程式碼的簡潔性。