《大话设计模式》中将23种常用的设计模式分为3种类型,创建型、结构型和行为型。设计模式的前提是面向对象编程,目的是实现类的高内聚,低耦合,依据是设计模式的几条原则。
本文主要介绍创建型设计模式,主要有以下几类:
- 抽象工厂模式
- 建造者模式
- 工厂方法模式
- 原型模式
- 单例模式
创建型模式隐藏了类的实例创建的细节, 整个系统面对是抽象类定义的接口,无须关注类实例的创建、组合等。
抽象工厂(Abstract Factory)模式
抽象工厂模式:提供一个创建一系列或相关依赖对象的接口,而无须指定它们具体的类。
如何实现:在简单工厂和工厂方法的基础上扩展,定义抽象的工厂,每一个继承的工厂子类,实现的不是一个,而是多个实例的返回接口。
常见应用:访问数据库的若干个数据表的操作。
优点:构造实例和客户端分离。
缺点:开发量增加
建造者(Builder)模式
建造者模式:将一个复杂对象的构造与表示分离,使得同样的构建过程可以创建不同的表示。
如何实现:定义抽象的Builder,每一个继承的Builder实现对象各个部件的构建,Director定义整个构建流程,利用具体的Builder构造对象。
常见应用:当一个对象的构建过程稳定,但是构建方法多样时使用。
优点:对象的构造和表示解耦,要求对象建造顺序通常是稳定的。
工厂方法(Factory Method)
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。
如何实现:在简单工厂模式的基础上改进,定义一个抽象的父类,子类为一个个具体的工厂,每个子类返回一个具体的实例。
常见应用:工厂方法是通常设计的初始模式,当发现需要更多灵活性时,开始考虑采用别的设计模式。
优点:简单工厂的进一步抽象和扩展,克服了简单工厂的封闭-开放原则上的不足。
缺点:每添加一个实例,需要添加一个构造实例的工厂,增加了开发量。
原型(Prototype)模式
原型模式:用原型实例创建指定对象的种类,并且通过拷贝这些原型创建新对象。
如何实现:实现一种深拷贝的方法,可以用这个方法构造新的对象。
常见应用:Java Spring引用bean时,默认是单例模式,scope=singleton;如果scope=prototype,会利用再次创建一个新的bean。
单例(Singleton)模式
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
如何实现:将构造函数定义为private,类中持有一个实例,并提供一个public static的方法返回实例。但是要注意,对于多线程的实现要有加锁和2次持有实例的判空操作。
常见应用:Java 中的单测样例, @Test为单例模式
创建方式:单例模式的创建有2种,一种称为饿汉式,对象被加载时就实例化;第二种称为懒汉式,直到第一次引用时才实例化。
参考文献
大话设计模式 - 程杰 著