簡單說來,工廠方法模式的作用就是可以根據不同的條件生成各種類的實例,這些實例通常屬于多個相似的類型,并且具有共同的父類。工廠方法模式將這些實例的創(chuàng)建過程封裝了起來,從而簡化了客戶程序的編寫,并改善了軟件體系結構的可擴展性,使得將來能夠以最小的代價加入新的子類。工廠方法這一模式適合在如下場合中運用:
當無法得知必須創(chuàng)建的對象屬于哪個類的時候,或者無法得知屬于哪個類的對象將被返回的時候,但前提是這些對象都符合一定的接口標準。
當一個類希望由它的子類來決定所創(chuàng)建的對象的時候,其目的是使程序的可擴展性更好,在加入其他類時更具彈性。
當創(chuàng)建對象的職責被委托給多個幫助子類(helper subclass)中的某一個,并且希望將哪個子類是代理者這一信息局部化的時候。
需要說明的是,使用工廠方法模式創(chuàng)建對象并不意味著一定會讓代碼變得更短(實事上往往更長),并且可能需要設計更多的輔助類,但它的確可以靈活地、有彈性地創(chuàng)建尚未確定的對象,從而簡化了客戶端應用程序的邏輯結構,并提高了代碼的可讀性和可重用性。
拿一個動物工廠來舉例說明
class Animal(object): def eat(self, food): raise NotImplementedError() class Dog(Animal): def eat(self, food): print '狗吃', food class Cat(Animal): def eat(self, food): print '貓吃', food class AnimalFactory(object): def create_animal(self): raise NotImplementedError() class DogFactory(Animal): def create_animal(self): return Dog() class CatFactory(AnimalFactory): def create_animal(self): return Cat() def client(): animal_factory = DogFactory() animal = animal_factory.create_animal() animal.eat('肉骨頭') animal_factory = CatFactory() animal = animal_factory.create_animal() animal.eat('魚骨頭')
下面是簡單工廠模式的實現:
class Animal(object): def eat(self, food): raise NotImplementedError() class Dog(Animal): def eat(self, food): print '狗吃', food class Cat(Animal): def eat(self, food): print '貓吃', food def create_animal(name): if name == 'dog': return Dog() elif name == 'cat': return Cat() def client(): animal = create_animal('dog') animal.eat('肉骨頭') animal = create_animal('cat') animal.eat('魚骨頭')
看起來工廠方法模式要復雜很多啊,也沒覺得比簡單工廠模式有什么好處,為什么還要用工廠方法模式呢? 簡單工廠模式的優(yōu)點很明顯,工廠函數封裝了邏輯判斷,客戶端使用負擔要小很多。相應的問題也很明顯,要增加新的產品類型,就需要修改工廠函數,這違背了開閉原則。 但是工廠方法模式似乎繞了一圈又回到原始時代了,下面寫不就行了嗎,何必外面套一層Factory:
class Animal(object): def eat(self, food): raise NotImplementedError() class Dog(Animal): def eat(self, food): print '狗吃', food class Cat(Animal): def eat(self, food): print '貓吃', food def client(): dog = Dog() dog.eat('肉骨頭') cat = Cat() cat.eat('魚骨頭')
工廠方法模式,對于需要做強類型檢查的語言比如Java、C++等在組織代碼時是有好處的。對于Python這種動態(tài)語言來說,感覺體現不出太多價值,或許我還沒有理解工廠方法模式的真諦。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com