时间:2021-07-01 10:21:17 帮助过:81人阅读
简单说来,工厂方法模式的作用就是可以根据不同的条件生成各种类的实例,这些实例通常属于多个相似的类型,并且具有共同的父类。工厂方法模式将这些实例的创建过程封装了起来,从而简化了客户程序的编写,并改善了软件体系结构的可扩展性,使得将来能够以最小的代价加入新的子类。工厂方法这一模式适合在如下场合中运用:
当无法得知必须创建的对象属于哪个类的时候,或者无法得知属于哪个类的对象将被返回的时候,但前提是这些对象都符合一定的接口标准。
当一个类希望由它的子类来决定所创建的对象的时候,其目的是使程序的可扩展性更好,在加入其他类时更具弹性。
当创建对象的职责被委托给多个帮助子类(helper subclass)中的某一个,并且希望将哪个子类是代理者这一信息局部化的时候。
需要说明的是,使用工厂方法模式创建对象并不意味着一定会让代码变得更短(实事上往往更长),并且可能需要设计更多的辅助类,但它的确可以灵活地、有弹性地创建尚未确定的对象,从而简化了客户端应用程序的逻辑结构,并提高了代码的可读性和可重用性。
拿一个动物工厂来举例说明
- 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('鱼骨头')
看起来工厂方法模式要复杂很多啊,也没觉得比简单工厂模式有什么好处,为什么还要用工厂方法模式呢? 简单工厂模式的优点很明显,工厂函数封装了逻辑判断,客户端使用负担要小很多。相应的问题也很明显,要增加新的产品类型,就需要修改工厂函数,这违背了开闭原则。 但是工厂方法模式似乎绕了一圈又回到原始时代了,下面写不就行了吗,何必外面套一层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这种动态语言来说,感觉体现不出太多价值,或许我还没有理解工厂方法模式的真谛。