1. 程式人生 > >一文詳解“工廠方法模式”以及python語言的實現

一文詳解“工廠方法模式”以及python語言的實現

一、什麼是“工廠方法模式”——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)在增加新的一個型別時,也必須增加相應的新的工廠類,會帶來額外的開銷,會導致很多的工廠類,影響程式碼的簡潔性。