简单工厂模式的最大优点就是工厂类内部包含了必要的逻辑判断,客户端只要提供选择条件即可,这样客户端就不需要知道具体产品的信息了。
但是每次增加产品就要修改工厂类,违背了“开放-封闭”原则。
所以,有了工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法模式相对于简单工厂模式的
优点在于,抽象了产品工厂这个类,让它变成了一个接口,只要某个类实现了这个接口,它就可以被当做工厂类来用,这样每添加一个产品的时候,就添加一下相应的生产工厂类,其它地方就可以使用了,满足“开放-封闭”原则;
缺点在于,把生产产品的逻辑判断从工厂中剥离了出去。
#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();
类图:这是计算器改成工厂方法模式的类图,学雷锋的类图类似。