【设计模式】工厂方法模式

2018-05-24  本文已影响0人  flowerAO

概念

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
也就是说,如果需要增加一个运算,那么除了增加一个类以外,还要修改工厂。这样就违背了开放-封闭原则。

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

根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂。于是 ,要增加一个功能的时候,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断转移到客户端代码来进行。要增加功能,原来改工厂类的,现在是修改客户端。

雷锋工厂

薛磊风作为一个大学生,以学雷锋做好事的名义去帮助老人做事,如何设计?

# /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()
工厂方法模式结构图
上一篇 下一篇

猜你喜欢

热点阅读