zoukankan      html  css  js  c++  java
  • python设计模式之工厂方法

      继上篇简单工厂博客的例子, 走进到2000年,人们对鞋子的质量要求开始提升了,人们愿意花更高的价格获得质量更好的鞋子,于是万能造小作坊开始转型了专做一种鞋型, 这样工人的熟练度高了做出来的鞋子质量也更好了,慢慢地 A作坊我就专门生产老北京布鞋, B作坊专门生产板鞋, C作坊专门生产山地鞋,专门的作坊生产唯一的鞋型,和我们接下来说的工厂方法设计模式一个,一个工厂生产一种产品。

      工厂方法设计模式GOF官方解释是: 定义一个用于创建对象的接口, 让子类决定实例化哪一个类, 工厂方法模式使得一个类的实例化延迟到了子类。

    结构图如下:

    01、 创建我们的工厂基类和产品基类

    class Shoes:
        def put(self):
            print("终于穿上新鞋了")
            
    
    class Factory:
        
        def produce_shoes(self):
            print("吭呲吭呲生产鞋子")

    02、创建产品子类

    class BeiJingShoes(Shoes):
    
        def put(self):
            print("终于穿上老北京鞋了")
    
    
    class BanShoes(Shoes):
    
        def put(self):
            print("终于穿上板鞋了")
    
    
    class MountShoes(Shoes):
    
        def put(self):
            print("终于穿上山地鞋了")

    03、创建工厂子类

    class BeiJingFactory(Factory):
        
        def produce_shoes(self):
            return BeiJingShoes()
    
    
    class BanFactory(Factory):
    
        def produce_shoes(self):
            return BanShoes()
    
    
    class MountFactory(Factory):
    
        def produce_shoes(self):
            return MountShoes()

    04、 执行我们的主程序

    if __name__ == "__main__":
        beijing_factory = BeiJingFactory()
        ban_factory = BanFactory()
        mount_factory = MountFactory
        beijing_shoes = beijing_factory.produce_shoes()
        beijing_shoes.put()

      我们想生产什么种类的鞋子,我们就实例化对应的工厂,即使在我们工作中创建需求经常变,我们只要创建对应的工厂和产品类就可以了。

    05、总结

    1. 此模式隔离了类对象的使用者和具体类型间的耦合关系。如果面对一个经常变化的具体类型, 紧耦合关系会导致软件的脆弱。
    2. 通过面向对象的手法, 将所要创建的具体对象工作延迟到了子类, 从而实现一种扩展而非更改的策略,较好地解决了这种紧耦合关系。
    3. 缺点在于每个创建工厂的方法参数要一致

    最后奉上设计模式八大设计原则:

    1. 依赖倒置原则(DIP)
    * 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
    * 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。
    2. 开放封闭原则(OCP)
    * 对扩展开放,对更改封闭。
    * 类模块应该是可扩展的,但是不可修改。
    3. 单一职责原则(SRP)
    * 一个类应该仅有一个引起它变化的原因。
    * 变化的方向隐含着类的责任。
    4. Liskov 替换原则(LSP)
    * 子类必须能够替换它们的基类(IS-A)。
    * 继承表达类型抽象。
    5. 接口隔离原则(ISP)
    * 不应该强迫客户程序依赖它们不用的方法。
    * 接口应该小而完备。
    6. 优先使用对象组合,而不是类继承
    * 类继承通常为“白箱复用”,对象组合通常为“黑箱复用” 。
    * 继承在某种程度上破坏了封装性,子类父类耦合度高。
    * 而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。
    7. 封装变化点
    * 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
    8. 针对接口编程,而不是针对实现编程
    * 不将变量类型声明为某个特定的具体类,而是声明为某个接口。
    * 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
    * 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案
  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/lifei01/p/13219809.html
Copyright © 2011-2022 走看看