概念
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
也就是说,如果需要增加一个运算,那么除了增加一个类以外,还要修改工厂。这样就违背了开放-封闭原则。
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂。于是 ,要增加一个功能的时候,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断转移到客户端代码来进行。要增加功能,原来改工厂类的,现在是修改客户端。
雷锋工厂
薛磊风作为一个大学生,以学雷锋做好事的名义去帮助老人做事,如何设计?
# /usr/bin/python
# coding=utf-8
class LeiFeng:
def sweep(self):
print "扫地"
def wash(self):
print "洗碗"
def buyrice(self):
print "买米"
class undergraduate(LeiFeng):
pass
student1 = undergraduate()
student1.buyrice()
student1.sweep()
student1.wash()
增加一个“社区志愿者”类
# /usr/bin/python
# coding=utf-8
class LeiFeng:
def sweep(self):
print "扫地"
def wash(self):
print "洗碗"
def buyrice(self):
print "买米"
class undergraduate(LeiFeng):
pass
class volunteer(LeiFeng):
pass
class simpleFactory:
@staticmethod
def createleifeng(type):
switcher = {
"学雷锋的大学生": undergraduate(),
"社区志愿者": volunteer()
}
return switcher[type]
studentA = simpleFactory.createleifeng("学雷锋的大学生")
studentA.buyrice()
studentB = simpleFactory.createleifeng("学雷锋的大学生")
studentA.sweep()
studentC = simpleFactory.createleifeng("学雷锋的大学生")
studentC.wash()
需要在任何实例化的时候写出这个工厂的代码,有过多重复。
# /usr/bin/python
# coding=utf-8
class leifeng:
def sweep(self):
print "扫地"
def wash(self):
print "洗碗"
def buyrice(self):
print "买米"
class undergraduate(leifeng):
pass
class volunteer(leifeng):
pass
class IFactory:
def createleifeng(self):
pass
class undergraduateFactory(IFactory):
def createleifeng(self):
return undergraduate()
class volunteerFactory(IFactory):
def createleifeng(self):
return volunteer()
factory = undergraduateFactory()
student = factory.createleifeng()
student.sweep()
student.buyrice()
student.wash()
工厂方法模式结构图