创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。单例模式目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
winter
单例模式也是创建型的设计模式之一,本文是设计模式系列(共24节)的第2篇文章。设计模式是基于六大设计原则进行的经验总结:《第一节:设计模式的六大原则》创建型设计模式共5种:
单例模式(Singleton Pattern):一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
工厂方法模式(Factory Pattern):在工厂方法模式中,工厂类成为了抽象类,实际的创建工作将由其具体子类来完成。
抽象工厂模式(Abstract Factory):抽象工厂可以向客户提供一个接口,创建多个产品族中的产品对象,强调的是“对象系列”的变化。
建造者模式(Builder Pattern):把构造对象实例的逻辑移到了类的内部,在类的外部定义了该类的构造逻辑,强调的是产品的构造过程。
原型模式(Prototype Pattern):原型模式和工厂模式一样,同样对客户隐藏了对象创建工作具体的实现细节,通过复制一个现有的对象生成新对象。

单例模式是什么
单例模式(Singleton Pattern)可以说是整个设计中最简单的模式之一,且这种模式即使在没有看设计模式相关资料也经常在编码开发中。因为在编程开发中经常会遇到这样一种场景,那就是需要保证一个类只有一个实例哪怕多线程同时访问,并需要提供一个全局访问此实例的点。综上以及我们平常的开发中,可以总结一条经验,单例模式主要解决的是,一个全局使用的类频繁的创建和消费,从而提升提升整体的代码的性能。
普通模式(非线程安全)
普通模式的特点是:不允许外部直接创建,且对象是全局共享。
下面 例子1 是普通实现方法的单例模式,也是我们最常用的:
代码分析:
因此虽然在默认的构造函数上添加了私有属性private,也确实满足了懒加载,但是如果有多个访问者同时去获取对象实例,你可以想象很多人在抢厕所,就会造成多个同样的实例并存,所以是非线程安全的。
饿汉模式(线程安全)
饿汉式单例模式的特点是:类在加载时就直接初始化了实例。即使没用到,也会实例化,因此,它也是线程安全的单例模式。
下面 例子2 是饿汉模式:
懒汉模式(加锁&线程安全)
懒汉式单例模式的特点:对比普通模式,给方法加了排它锁,这是线程安全的写法;对比饿汉模式,全局对象只会在用到时才会进行初始化。
下面 例子3 是懒汉模式:
双重校验模式
双重校验模式的特点:考虑到多线程下的并发操作,全局对象使用了 volatile关键字 修饰,同时在对象初始化时进行加锁防止对象被其他线程重复创建。
此处可以参考《Java并发编程实战》的 第3章volatile的使用。
下面 例子4 是双重校验模式:
内部类模式
内部类模式的特点是:由于静态内部类跟外部类是平级的,所以外部类加载的时候不会影响内部类,因此实现了懒加载。
下面 例子5 是内部类模式:
枚举类模式
枚举类模式的特点是:创建一个枚举类,封装一个对象,通过枚举类的私有构造器,强化了单例模式,且实现了懒加载,当唯一全局入口被调用才会初始化对象。
此处可以参考《Effective Java》的 第3点 以及 第4点。
下面 例子6 枚举类模式:
通过私有化构造器可以强化单例属性。
总结
单例模式应该是最常见的设计模式之一了,它归类在设计模式创建型模式,用于解决对象创建的对象复用问题。创建型模式还包括:原型模式、工厂模式、抽象工厂模式和建造者模式,待后续我们再细细解读。
扫描二维码
获取技术干货
后台技术汇