简单工厂模式的最大优点就是工厂类内部包含了必要的逻辑判断,客户端只要提供选择条件即可,这样客户端就不需要知道具体产品的信息了。
但是每次增加产品就要修改工厂类,违背了“开放-封闭”原则。
所以,有了工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法模式相对于简单工厂模式的
优点在于,抽象了产品工厂这个类,让它变成了一个接口,只要某个类实现了这个接口,它就可以被当做工厂类来用,这样每添加一个产品的时候,就添加一下相应的生产工厂类,其它地方就可以使用了,满足“开放-封闭”原则;
但是每次增加产品就要修改工厂类,违背了“开放-封闭”原则。
所以,有了工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法模式相对于简单工厂模式的
优点在于,抽象了产品工厂这个类,让它变成了一个接口,只要某个类实现了这个接口,它就可以被当做工厂类来用,这样每添加一个产品的时候,就添加一下相应的生产工厂类,其它地方就可以使用了,满足“开放-封闭”原则;
缺点在于,把生产产品的逻辑判断从工厂中剥离了出去。
#encoding=utf-8
#
#by panda
#工厂方法模式
def printInfo(info):
print unicode(info, 'utf-8').encode('gbk')
#雷锋
class LeiFeng():
def Sweep(self):
printInfo('扫地')
def Wash(self):
printInfo('洗衣')
def BuyRice(self):
printInfo('买米')
#学雷锋的大学生
class Undergraduate(LeiFeng):
def __init__(self):
printInfo('学雷锋的大学生')
pass
#社区志愿者
class Volunteer(LeiFeng):
def __init__(self):
printInfo('社区志愿者')
pass
#简单雷锋工厂
class SimpleFactory():
@staticmethod
def CreateLeiFeng(type):
if type == '学雷锋的大学生':
return Undergraduate()
elif type == '社区志愿者':
pass
#雷锋抽象工厂
class IFactory():
@staticmethod
def CreateLeiFeng():
return LeiFeng()
#学雷锋的社区志愿者工厂
class VolunteerFactory(IFactory):
@staticmethod
def CreateLeiFeng():
return Volunteer()
#学雷锋的大学生工厂
class UndergraduateFactory(IFactory):
@staticmethod
def CreateLeiFeng():
return Undergraduate()
def clientUI():
printInfo('----------------简单工厂模式--------------')
studentA = SimpleFactory.CreateLeiFeng('学雷锋的大学生')
studentA.BuyRice()
studentA.Sweep()
studentA.Wash()
printInfo('----------------工厂方法模式--------------')
studentB = VolunteerFactory.CreateLeiFeng()
studentB.BuyRice()
studentB.Sweep()
studentB.Wash()
return
if __name__ == '__main__':
clientUI();
类图:这是计算器改成工厂方法模式的类图,学雷锋的类图类似。