美文网首页
【设计模式】工厂方法模式

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

作者: flowerAO | 来源:发表于2018-05-24 21:35 被阅读0次

概念

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

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

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

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

雷锋工厂

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

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

相关文章

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式之工厂方法模式(创建型)

    一、模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进...

  • spring 设计模式篇(前)

    设计模式俗称:套路 一、spring常见设计模式 (23种设计模式) 创建型:工厂方法模式、抽象工厂模式、建造者...

  • 设计模式系列-简单工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 定义 简单工厂模式又叫做静态工厂方法模式...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

  • 设计模式之简单工厂、工厂方法、抽象工厂

    设计模式之简单工厂、工厂方法、抽象工厂 什么是设计模式? 设计模式(Design pattern)代表了最佳的实践...

  • 设计模式(六)抽象工厂模式

    导读:前文设计模式(五)工厂方法模式介绍了工厂方法模式,本篇开始介绍抽象工厂模式,继续优化工厂方法模式,更好的满足...

网友评论

      本文标题:【设计模式】工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/wijwdftx.html