设计模式-工厂方法模式-factorymethod-python

来源:互联网 发布:制版软件 编辑:程序博客网 时间:2024/05/16 10:10

def

定义一个用于创建对象的接口, 让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类。

usage

一个对象创建是有条件约束的, 如一个调用者需要一个具体的产品对象, 只要知道这个产品的类名(或约束字符串) 就可以了, 不用知道创建对象的艰辛过程, 降低模块间的耦合。

在增加产品类的情况下, 只要适当地修改具体的工厂类或扩展一个工厂类, 就可以完成“拥抱变化”。

产品类的实现如何变化, 调用者都不需要关心, 它只需要关心产品的接口, 只要接口保持不变, 系统中的上层模块就不要发生变化。

工厂方法模式是典型的解耦框架。 高层模块值需要知道产品的抽象类, 其他的实现类都不用关心, 符合迪米特法则, 我不需要的就不要去交流; 也符合依赖倒置原则, 只依赖产品类的抽象; 当然也符合里氏替换原则, 使用产品子类替换产品父类。

code

class GreekGetter(object):    """A simple localizer a la gettext"""    def __init__(self):        self.trans = dict(dog="σκύλος", cat="γάτα")    def get(self, msgid):        """We'll punt if we don't have a translation"""        return self.trans.get(msgid, str(msgid))class EnglishGetter(object):    """Simply echoes the msg ids"""    def get(self, msgid):        return str(msgid)def get_localizer(language="English"):    """The factory method"""    languages = dict(English=EnglishGetter, Greek=GreekGetter)    return languages[language]()if __name__ == '__main__':    # Create our localizers    e, g = get_localizer(language="English"), get_localizer(language="Greek")    # Localize some text    for msgid in "dog parrot cat bear".split():        print(e.get(msgid), g.get(msgid))### OUTPUT #### dog σκύλος# parrot parrot# cat γάτα# bear bear
原创粉丝点击