浅谈设计模式 -- 单例模式
一、什么是设计模式?
顾名思义,设计模式是软件开发人员在长期开发实践中总结出来解决一系列问题行之有效的解决方案。
二、何为单例模式?
程序中只能创建一个实例,主要解决一个全局使用的类频繁地创建与销毁,从而节省系统资源。
三、如何创建单例模式?
- 通常情况下我们通过new 的关键字创建一个类的实例,实际上是通过类的构造方法去创建对象,所有想要实现单例的第一步就是封闭类的构造方法,不能随意让外部访问从而创建对象,需要把构造方法私有化(private);
- 对外提供统一创建实例的静态方法,创建实例的行为由自身控制。
四、饿汉模式
package top.flash.singleton; /** * 单例模式 -- 饿汉模式 */ public class Singleton { //私有的构造方法 private Singleton(){} //初始化时创建实例 private static Singleton instance = new Singleton(); //对外提供获取实例的方法 public static Singleton getInstance(){ return instance; } }
上述代码就是典型的饿汉模式,加载类的时候初始化一个对象实例,(因为没吃饱?),优点是执行效率较高,缺点是初始化的时候创建实例,浪费内存。
五、懒汉模式
package top.flash.singleton; /** * 单例模式 -- 懒汉模式 */ public class Singleton2 { //私有构造方法 private Singleton2(){} //初始化时声明变量 private static Singleton2 instance; //提供外部获取实例方法 public static Singleton2 getInstance(){ if(null == instance){ instance = new Singleton2(); } return instance; } }
上述的例子存在一个问题就是多线程访问下仍然会创建多个实例,属于线程不安全,所以需要加锁保证唯一性,也就是双重校验锁。
package top.flash.singleton; /** * 双重校验锁 */ public class Singleton3 { private volatile static Singleton3 instance; private Singleton3 (){} public static Singleton3 getSingleton() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton3(); } } } return instance; } }
除此之外,还有创建静态内部类、枚举等方法也能创建相应的单例,这里就不一一介绍。