创建型 - 单例模式(Singleton pattern)

类图

使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量
2_singleton_1.png

实现方式

懒汉式-线程不安全

私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源

饿汉式-线程安全

线程不安全问题主要是由于 uniqueInstance 被多次实例化,采取直接实例化 uniqueInstance 的方式就不会产生线程不安全问题。

懒汉式-线程安全

只需要对 getUniqueInstance() 方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了多次实例化 uniqueInstance 的问题。

静态内部类实现

当 Singleton 类加载时,静态内部类 SingletonHolder 没有被加载进内存。
只有当调用 getUniqueInstance() 方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例。

创建型 - 简单工厂(Simple Factory)

意图

在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口

它把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实现
例化,这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类
设计模式 - 图2

#Implementation

  1. public interface Product { }
  1. public class ConcreteProduct implements Product { }
  1. public class ConcreteProduct1 implements Product { }
  1. public class ConcreteProduct2 implements Product { }


以下的 Client 类包含了实例化的代码,这是一种错误的实现。如果在客户类中存在这种实例化代码,就需要考虑将代码放到简单工厂中

  1. public class Client {
  2. public static void main(String[] args) {
  3. int type = 1;
  4. Product product;
  5. if (type == 1) {
  6. product = new ConcreteProduct1();
  7. } else if (type == 2) {
  8. product = new ConcreteProduct2();
  9. } else {
  10. product = new ConcreteProduct();
  11. }
  12. // do something with the product
  13. }
  14. }


以下的 SimpleFactory 是简单工厂实现,它被所有需要进行实例化的客户类调用。

  1. public class SimpleFactory {
  2. public Product createProduct(int type) {
  3. if (type == 1) {
  4. return new ConcreteProduct1();
  5. } else if (type == 2) {
  6. return new ConcreteProduct2();
  7. }
  8. return new ConcreteProduct();
  9. }
  10. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. SimpleFactory simpleFactory = new SimpleFactory();
  4. Product product = simpleFactory.createProduct(1);
  5. // do something with the product
  6. }
  7. }

创建型 - 工厂方法(Factory Method)

意图

定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类

类图

在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象

Class Diagram

下图中,Factory 有一个 doSomething() 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。
设计模式 - 图3

  1. public abstract class Factory {
  2. abstract public Product factoryMethod();
  3. public void doSomething() {
  4. Product product = factoryMethod();
  5. // do something with the product
  6. }
  7. }
  1. public class ConcreteFactory extends Factory {
  2. public Product factoryMethod() {
  3. return new ConcreteProduct();
  4. }
  5. }
  1. public class ConcreteFactory1 extends Factory {
  2. public Product factoryMethod() {
  3. return new ConcreteProduct1();
  4. }
  5. }
  1. public class ConcreteFactory2 extends Factory {
  2. public Product factoryMethod() {
  3. return new ConcreteProduct2();
  4. }
  5. }

创建型 - 抽象工厂(Abstract Factory)

类图

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同

意图

提供一个接口,用于创建 相关的对象家族

创建型 - 原型模式(Prototype)

意图

使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象

结构型 - 适配器(Adapter)

意图

把一个类接口转换成另一个用户需要的接口

结构型 - 外观(Facade)

意图

提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用

行为型 - 迭代器(Iterator)

意图

提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示