设计模式 + UML(一)

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

为何大量设计模式在动态语言中不适用? – 知乎

https://www.zhihu.com/questio…

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

工厂方法(Factory Method)

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

《设计模式 + UML(一)》

代码实现:JavaPython
(注:Python代码充分利用了dict数据结构的特性,所以,代码上与Java略有不同)

抽象工厂(Abstract Factory)

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

抽象工厂使一个工厂能生产多个产品。抽象工厂是所有具体工厂的抽象。

《设计模式 + UML(一)》

画完这个UML图,所以我感觉抽象工厂模式,其实就是让工厂多加几个工厂方法,来生产多个产品???

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

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

抽象工厂模式和工厂模式的区别? – 名姓的回答 – 知乎

https://www.zhihu.com/questio…

代码实现:JavaPython

单例模式(Singleton)

只允许类的对象被实例化一次。通常用于全局变量。单例模式创建的对象,可以用作共享信息的存放。

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

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

《设计模式 + UML(一)》

    原文作者:设计模式
    原文地址: https://segmentfault.com/a/1190000013512320
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞