继上篇简单工厂博客的例子, 走进到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. 依赖倒置原则(DIP) * 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。 * 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。 2. 开放封闭原则(OCP) * 对扩展开放,对更改封闭。 * 类模块应该是可扩展的,但是不可修改。 3. 单一职责原则(SRP) * 一个类应该仅有一个引起它变化的原因。 * 变化的方向隐含着类的责任。 4. Liskov 替换原则(LSP) * 子类必须能够替换它们的基类(IS-A)。 * 继承表达类型抽象。 5. 接口隔离原则(ISP) * 不应该强迫客户程序依赖它们不用的方法。 * 接口应该小而完备。 6. 优先使用对象组合,而不是类继承 * 类继承通常为“白箱复用”,对象组合通常为“黑箱复用” 。 * 继承在某种程度上破坏了封装性,子类父类耦合度高。 * 而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。 7. 封装变化点 * 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。 8. 针对接口编程,而不是针对实现编程 * 不将变量类型声明为某个特定的具体类,而是声明为某个接口。 * 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。 * 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案