设计模式是基于设计模式原则的基础上,由众多软件开发人员对所遇到的软件工程设计问题所总结的经验,它是某类问题的解决方案,代表了某类问题的最佳实践,它的最终目的是为了提高软件的可维护性,可读性,通用性,可扩展性等。
设计模式最经典的书籍就是由“四人组GOF”所编写的【设计模式】,该书将设计模式总结为三种类型,共23种,我后续的设计模式就按照这23种设计模式逐一讲解。
23种设计模式分别如下:
本文讲解创建型模式中的单例模式。
单例设计模式就是保证在整个软件系统中,对某个类只能存在一个对象实例,该对象实例由类提供一个静态方法获取。
单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
基于单例模式的特点,其应用场景如下:
所谓饿汉式实现就是指,不论这个类对象是否会用到,在类加载的时候就进行实例化。
饿汉式单例模式,直接对静态变量进行实例化,代码实现如下:
class Singleton {
//1. 构造器私有化, 外部能new
private Singleton() {
}
//2.本类内部直接创建对象实例
private final static Singleton instance = new Singleton();
//3. 提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
饿汉式单例模式,将静态变量在静态代码块中进行实例化,代码实现如下:
class Singleton {
//1. 构造器私有化, 外部能new
private Singleton() {
}
//2.本类内部创建对象实例
private static Singleton instance;
static { // 在静态代码块中,创建单例对象
instance = new Singleton();
}
//3. 提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
所谓懒汉式实现是指只有用到某个类对象时才会创建,用不到就不会创建,可以减少系统资源浪费。具体实现方法包括多线性不安全和多线程安全两种类型,对应线程不安全的实现只适用于单线程使用。
class Singleton {
private static Singleton instance;
private Singleton() {}
//提供一个静态的公有方法,当使用到该方法时,才去创建 instance
//即懒汉式
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
代码实现:
class Singleton {
private static Singleton instance;
private Singleton() {}
//提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
//即懒汉式
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
class Singleton {
private static volatile Singleton instance;//必须使用volatile关键字,防止指令重排
private Singleton() {}
//提供一个静态的公有方法,加入双重检查代码,解决线程安全问题, 同时解决懒加载问题
//同时保证了效率, 推荐使用
public static Singleton getInstance() {
if(instance == null) {//如果尚未创建对象,可能多个线程进入下面的代码块
synchronized (Singleton.class) {//保证一次只能有一个线程进入其代码块
if(instance == null) {//假设一个线程已经实例化了对象,如果再有线程进来,就会发现instance不为null,就不会再实例化对象
instance = new Singleton();
}
}
}
return instance;
}
}
class Singleton {
//构造器私有化
private Singleton() {}
//写一个静态内部类,该类中有一个静态属性 Singleton
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
enum Singleton {
INSTANCE; //属性
}
JDK中Runtime类就是实现了饿汉式单例模式,部分源码如下: