创建型 - 单例模式(Singleton pattern)
类图
使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量
实现方式
懒汉式-线程不安全
私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源
饿汉式-线程安全
线程不安全问题主要是由于 uniqueInstance 被多次实例化,采取直接实例化 uniqueInstance 的方式就不会产生线程不安全问题。
懒汉式-线程安全
只需要对 getUniqueInstance() 方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了多次实例化 uniqueInstance 的问题。
静态内部类实现
当 Singleton 类加载时,静态内部类 SingletonHolder 没有被加载进内存。
只有当调用 getUniqueInstance() 方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例。
创建型 - 简单工厂(Simple Factory)
意图
在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口
它把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实现
例化,这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类
#Implementation
public interface Product { }
public class ConcreteProduct implements Product { }
public class ConcreteProduct1 implements Product { }
public class ConcreteProduct2 implements Product { }
以下的 Client 类包含了实例化的代码,这是一种错误的实现。如果在客户类中存在这种实例化代码,就需要考虑将代码放到简单工厂中
public class Client {public static void main(String[] args) {int type = 1;Product product;if (type == 1) {product = new ConcreteProduct1();} else if (type == 2) {product = new ConcreteProduct2();} else {product = new ConcreteProduct();}// do something with the product}}
以下的 SimpleFactory 是简单工厂实现,它被所有需要进行实例化的客户类调用。
public class SimpleFactory {public Product createProduct(int type) {if (type == 1) {return new ConcreteProduct1();} else if (type == 2) {return new ConcreteProduct2();}return new ConcreteProduct();}}
public class Client {public static void main(String[] args) {SimpleFactory simpleFactory = new SimpleFactory();Product product = simpleFactory.createProduct(1);// do something with the product}}
创建型 - 工厂方法(Factory Method)
意图
定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类
类图
在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象
Class Diagram
下图中,Factory 有一个 doSomething() 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。
public abstract class Factory {abstract public Product factoryMethod();public void doSomething() {Product product = factoryMethod();// do something with the product}}
public class ConcreteFactory extends Factory {public Product factoryMethod() {return new ConcreteProduct();}}
public class ConcreteFactory1 extends Factory {public Product factoryMethod() {return new ConcreteProduct1();}}
public class ConcreteFactory2 extends Factory {public Product factoryMethod() {return new ConcreteProduct2();}}
创建型 - 抽象工厂(Abstract Factory)
类图
抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同
意图
创建型 - 原型模式(Prototype)
意图
使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象
结构型 - 适配器(Adapter)
意图
结构型 - 外观(Facade)
意图
提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用
行为型 - 迭代器(Iterator)
意图
提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示
