除非需求非常明确,通常一开始无法确定哪些地方需要通过设计模式来优化代码的组织,因此通常的做法是先根据当前需求编写简单实现,等到变化发生时立即采取行动,分析、抽象、隔离这些变化。抽象不是越早越好,应当拒绝不成熟的抽象。**
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
基本思想
- 定义一个抽象的工厂接口类
- 定义一个抽象的产品接口类
- 根据需要从产品接口派生产品子类
- 对于每一个产品子类,从工厂接口派生工厂子类,负责该产品的创建
- 客户端根据实际需要,调用工厂子类,创建所需要的产品。
代码框架
拿简单工厂模式中的动物工厂来举例说明
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这种动态语言来说,感觉体现不出太多价值,或许我还没有理解工厂方法模式的真谛。
原文地址:http://www.isware.cn/python-design-pattern/02-factory-method/