设计模式学习–单例模式
二十三种设计模式是软件开发中十分重要的思想,也是面试中常问的点,因此很有必要进行深入的学习。本次博客也将对每个模式进行学习和分享,有问题的地方欢迎大家指出。
单例模式
Ensure a class has only one instance, and provide a global point of access to it.
单例模式(Single Pattern)是一个简单而常见的模式,它保证一个类只有一个实例,并且是自行实例化的,代码如下:
/**
* 单例类
* @Description:
* @author:wws
* @time:2018年8月15日 下午8:11:22
*/
public class Singleton {
private static final Singleton singleton = new Singleton();
// 使用private的构造函数确保应用中无法再产生实例
private Singleton(){}
// 获取实例的方法
public static Singleton getSingleton(){
return singleton;
}
// 其他方法尽量为static
public static void doSomething(){
}
}
优点
1.整个系统只有一个实例,内存占用小
2.代码结构简单、清晰
缺点
单例模式一般没有接口,扩展困难
应用
当在一个系统中,一个类仅需要一个对象,就可以使用单例模式。这也是Spring中默认使用的,这样Spring可以管理这个Bean的生命周期,而使用了非单例模式,Bean就交由J2EE容器管理。
注意点
单例模式是设计模式中一个十分基础且常用的模式,面试一般问的更多的是饿汉、懒汉模式,这里将附上代码说明:
/**
* 饿汉
* @Description:
* @author:wws
* @time:2018年8月16日 上午11:14:58
*/
public class SingleHungry {
// 默认开始就创建一个实例
private static SingleHungry singleHungry = new SingleHungry();
// 使用private禁止创建新实例
private SingleHungry(){}
// 获取实例
public static SingleHungry getInstance(){
return singleHungry;
}
}
/**
* 懒汉
* @Description:
* @author:wws
* @time:2018年8月16日 上午11:18:42
*/
public class SingleLazy {
// 默认为null,需要使用时,再创建实例
private static SingleLazy singleLazy = null;
private SingleLazy(){}
/**
* @Description:使用时判断singleLazy是否为空,不为空返回对象,为空新建;
* 但是可能会有并发问题,需要加上synchronized
* @return
* SingleLazy
* @exception:
* @author: wws
* @time:2018年8月16日 上午11:21:17
*/
public static synchronized SingleLazy getInstance(){
return Optional.ofNullable(singleLazy).orElse(new SingleLazy());
}
}
实际项目中,推荐使用的是饿汉模式,即使懒汉模式加了synchronized保证线程安全,但还是会带来一部分内存消耗。
参考书籍:
《设计模式之禅》