1. 程式人生 > >Python實現工廠模式

Python實現工廠模式

 作者:黎智煊,叩丁狼高階講師。本文為原創文章,轉載請註明出處。   

 

首先,什麼是工廠模式?

工廠模式是一個在軟體開發中用來建立物件的設計模式。

工廠模式包涵一個超類。這個超類提供一個抽象化的介面來建立一個特定型別的物件,而不是決定哪個物件可以被建立。

為了實現此方法,需要建立一個工廠類建立並返回。

當程式執行輸入一個“型別”的時候,需要創建於此相應的物件。這就用到了工廠模式。在如此情形中,實現程式碼基於工廠模式,可以達到可擴充套件,可維護的程式碼。當增加一個新的型別,不在需要修改已存在的類,只增加能夠產生新型別的子類

  1. 一個例子更能很好的理解以上的內容:

我們有一個基類Person ,包涵獲取名字,性別的方法 。有兩個子類male 和female,可以打招呼。還有一個工廠類。
工廠類有一個方法名getPerson有兩個輸入引數,名字和性別。
使用者使用工廠類,通過呼叫getPerson方法。

在程式執行期間,使用者傳遞性別給工廠,工廠建立一個與性別有關的物件。因此工廠類在執行期,決定了哪個物件應該被建立。

class Person:
    def __init__(self):
        self.name = None
        self.gender = None

    def getName(self):
        return self.name

    def getGender(self):
        return self.gender

class Male(Person):
    def __init__(self, name):
        print "Hello Mr." + name

class Female(Person):
    def __init__(self, name):
        print "Hello Miss." + name

class Factory:
    def getPerson(self, name, gender):
        if gender == ‘M':
                return Male(name)
            if gender == 'F':
            return Female(name)

if __name__ == '__main__':
    factory = Factory()
    person = factory.getPerson("Chetan", "M")

繼續舉其他例子:

多種品牌的汽車4S店

當買車時,有很多種品牌可以選擇,比如北京現代、別克、凱迪拉克、特斯拉等,那麼此時該怎樣進行設計呢?

定義一個基本的4S店類

class CarStore(object):

    #僅僅是定義了有這個方法,並沒有實現,具體功能,這個需要在子類中實現
    def createCar(self, typeName):
        pass

    def order(self, typeName):
        # 讓工廠根據型別,生產一輛汽車
        self.car = self.createCar(typeName)
        self.car.move()
        self.car.stop()

# 定義一個北京現代4S店類
class XiandaiCarStore(CarStore):

    def createCar(self, typeName):
        self.carFactory = CarFactory()
        return self.carFactory.createCar(typeName)


# 定義伊蘭特車類
class YilanteCar(object):

    # 定義車的方法
    def move(self):
        print("---車在移動---")

    def stop(self):
        print("---停車---")

# 定義索納塔車類
class SuonataCar(object):

    # 定義車的方法
    def move(self):
        print("---車在移動---")

    def stop(self):
        print("---停車---")

# 定義一個生產汽車的工廠,讓其根據具體得訂單生產車
class CarFactory(object):

    def createCar(self,typeName):
        self.typeName = typeName
        if self.typeName == "伊蘭特":
            self.car = YilanteCar()
        elif self.typeName == "索納塔":
            self.car = SuonataCar()

        return self.car

suonata = XiandaiCarStore()
suonata.order("索納塔")

最後來看看工廠方法模式的定義

  • 定義了一個建立物件的介面(可以理解為函式),但由子類決定要例項化的類是哪一個,工廠方法模式讓類的例項化推遲到子類,抽象的CarStore提供了一個建立物件的方法createCar,也叫作工廠方法。

  • 子類真正實現這個createCar方法創建出具體產品。 建立者類不需要直到實際建立的產品是哪一個,選擇了使用了哪個子類,自然也就決定了實際建立的產品是什麼。