设计模式 + UML(一)

本文介绍5种常见建立型设计模式(Creational Patterns)以及对应UML。同时,本文转载了Java和Python的代码实现。值得注意的是,Java是静态语言(强类型语言),变量必须声明数据类型;而Python是动态语言(弱类型语言),变量使用以前不须要类型声明,一般变量的类型是被赋值的那个值的类型。所以,在design pattern代码实现上,会有显著差异。(有些动态语言,好比Python,已经把设计模式作成了语言特性???)java

为什么大量设计模式在动态语言中不适用? - 知乎
https://www.zhihu.com/questio...

UML绘制工具:ProcessOn
Git Book:设计模式Java版python

工厂方法(Factory Method)

定义一个用于建立对象(Product)接口(Factory),让子类(ConcreteFactory)决定将哪个类(ConcreteProduct)实例化git

代码实现:JavaPython
(注:Python代码充分利用了dict数据结构的特性,因此,代码上与Java略有不一样)github

抽象工厂(Abstract Factory)

工厂方法模式存在着一个问题,该模式中的每一个工厂都只生产一种产品,势必致使大量工厂的存在。由此,咱们须要考虑将同一类产品组成“产品族”,用同一个工厂来统一辈子产,即抽象工厂。设计模式

抽象工厂使一个工厂能生产多个产品。抽象工厂是全部具体工厂的抽象。安全

画完这个UML图,因此我感受抽象工厂模式,其实就是让工厂多加几个工厂方法,来生产多个产品???数据结构

能够发现抽象工厂是有缺陷,批量增长工厂来生产不一样产品族(即,一个 (ProductA, productB) 元组)是方便的,可是要改变产品结构,即增长 ProductC 就必须修改抽象工厂。多线程

最后,感谢知友ichennan对工厂模式的终极总结:工具

抽象工厂模式和工厂模式的区别? - 名姓的回答 - 知乎
https://www.zhihu.com/questio...

代码实现:JavaPythonspa

单例模式(Singleton)

只容许类的对象被实例化一次。一般用于全局变量。单例模式建立的对象,能够用做共享信息的存放。

单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。

进一步地,为避免多线程环境下,多个线程同时调用getInstance方法建立实例,引入 饿汉式单例类懒汉式单例类 两种解决办法。前者,在定义静态变量的时候就实例化单例类,所以在类加载的时候就已经建立了单例对象;后者,使用关键字synchronized来避免多线程同时调用getInstance方法。两种模式各自存在缺点,终极解决办法是:Initialization-on-demand Holder(idiom)技术,由Java虚拟机来保证线程安全性。