现在的位置: 首页 > 综合 > 正文

工厂方法(python)

2012年03月20日 ⁄ 综合 ⁄ 共 1381字 ⁄ 字号 评论关闭

简单工厂模式的最大优点就是工厂类内部包含了必要的逻辑判断,客户端只要提供选择条件即可,这样客户端就不需要知道具体产品的信息了。
但是每次增加产品就要修改工厂类,违背了“开放-封闭”原则。
所以,有了工厂方法模式
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。

工厂方法模式相对于简单工厂模式的
优点在于,抽象了产品工厂这个类,让它变成了一个接口,只要某个类实现了这个接口,它就可以被当做工厂类来用,这样每添加一个产品的时候,就添加一下相应的生产工厂类,其它地方就可以使用了,满足“开放-封闭”原则;

缺点在于,把生产产品的逻辑判断从工厂中剥离了出去。

#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();

类图:这是计算器改成工厂方法模式的类图,学雷锋的类图类似。

抱歉!评论已关闭.