jessiejava 2019-06-26
本文介绍5种常见创建型设计模式(Creational Patterns)以及对应UML。同时,本文转载了Java和Python的代码实现。值得注意的是,Java是静态语言(强类型语言),变量必须声明数据类型;而Python是动态语言(弱类型语言),变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。因此,在design pattern代码实现上,会有显著差别。(有些动态语言,比如Python,已经把设计模式做成了语言特性???)
为何大量设计模式在动态语言中不适用? - 知乎
https://www.zhihu.com/questio...
UML绘制工具:ProcessOn
Git Book:设计模式Java版
定义一个用于创建对象(Product)的接口(Factory),让子类(ConcreteFactory)决定将哪一个类(ConcreteProduct)实例化
代码实现:Java,Python
(注:Python代码充分利用了dict数据结构的特性,所以,代码上与Java略有不同)
工厂方法模式存在着一个问题,该模式中的每个工厂都只生产一种产品,势必导致大量工厂的存在。由此,我们需要考虑将同一类产品组成“产品族”,用同一个工厂来统一生产,即抽象工厂。
抽象工厂使一个工厂能生产多个产品。抽象工厂是所有具体工厂的抽象。
(画完这个UML图,所以我感觉抽象工厂模式,其实就是让工厂多加几个工厂方法,来生产多个产品???)
可以发现抽象工厂是有缺陷,批量增加工厂来生产不同产品族(即,一个 (ProductA, productB) 元组)是方便的,但是要改变产品结构,即增加 ProductC 就必须修改抽象工厂。
最后,感谢知友ichennan对工厂模式的终极总结:
抽象工厂模式和工厂模式的区别? - 名姓的回答 - 知乎
https://www.zhihu.com/questio...
只允许类的对象被实例化一次。通常用于全局变量。单例模式创建的对象,可以用作共享信息的存放。
单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
进一步地,为避免多线程环境下,多个线程同时调用getInstance方法创建实例,引入 饿汉式单例类 和 懒汉式单例类 两种解决办法。前者,在定义静态变量的时候就实例化单例类,因此在类加载的时候就已经创建了单例对象;后者,使用关键字synchronized来避免多线程同时调用getInstance方法。两种模式各自存在缺点,终极解决办法是:Initialization-on-demand Holder(idiom)技术,由Java虚拟机来保证线程安全性。