今天想把工作和生活中接触到的一些设计模式总结一下,所以就有了写篇笔记类型文章的想法。下面我就写一下单例设计模式。我是做android开发的,所以思想可能和后端的思想不一样。
一,单例设计模式的意义
单例模式,就是应用运行时,如果需要某一个单例模式的类的对象时,这个对象只能有一个,不能有多个,即不能重复创建。这样可以减少对象创建的开销,提高应用性能。
代码编写思想:构造方法私有,使外界不能使用new来创建对象;提供一个静态方法,返回一个实例对象。
二,单例模式的几种写法
1 ,饿汉式写法
// 单例模式 (饿汉式,不存在多线程同步问题,
//但是假如这个类被加载时,我们并没有使用它的实例对象,
//那么在内存中instance对象就是无用的创建)
public class Singleton1 {
private Singleton1() {
}
private static Singleton1 instance = new Singleton1();
public static Singleton1 getInstance() {
return instance;
}
}
2 ,懒汉式写法第一种
/**
* 单例模式(懒汉式,线程不安全)
*/
public class Singleton2 {
private Singleton2() {
}
private static Singleton2 instance = null;
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
3 ,懒汉式写法第二种
/**
* 单例模式(懒汉式,线程安全,效率比2低)
*
*/
public class Singleton3 {
private Singleton3() {
}
private static Singleton3 instance = null;
// 给方法加锁,避免在多线程访问的时候重复初始化。
//但是在这个方法被频繁调用时,效率较低
public static synchronized Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
4 ,懒汉式写法第三种
/**
* 单例模式(懒汉式,线程安全,效率比3高)
*/
public class Singleton4 {
private Singleton4() {
}
private static Singleton4 instance = null;
public static Singleton4 getInstance() {
if (instance == null) {
// 在此处加锁,只有在对象实例不存在时,才同步代码块,
//保证多线程访问时对象在第一次被创建后不再被重复创建。
// 效率比在方法上加锁要高一些
synchronized (Singleton4.class) {
if (instance == null) {
instance = new Singleton4();
}
}
}
return instance;
}
}
5 ,对于最后一种懒汉式写法,好像说也有一些问题,搜了搜网上的相关资料,看有一种写法是在4的写法上把instance对象用volatile修饰下。
// volatile修饰的变量在线程每次使用的时候都会读取变量修改后的最后的值
// volatile很容易被误用,用来进行原子性操作
private static volatile Singleton5 instance = null;
三,总结
上面写了共计五种单例模式的写法,其中饿汉式一种,懒汉式四种。单例模式在代码编写方面大名鼎鼎,面试什么的好像提问几率很高,不过这个好像也是以前的事了,最近一段时间面试问的问题好像都更深了。写了写单例模式,忽然想不起我们项目中那里用到了单例模式,翻了翻代码,看到好像只有User类用到了,用的还是饿汉式。好吧,记个笔记,以谋将来。