今天介绍Java中常见的一种设计模式:单例模式
文章目录
那么什么是单例模式呢?
单例模式(Singleton Pattern):单例模式是Java中最简单的设计模式之一。单例模式的目的是为了保证该类只有一个实例,这个实例由该类自己创建,并提供一个全局的访问点。访问单例模式的对象时可以直接访问不需要创建该对象的实例。
单例模式的注意点:
单例类只有一个实例
单例类的实例必须由它自己创建
单例类必须给其他对象提供统一的访问点
单例模式的优点:
1、在内存里只有一个实例从而减少了内存的开销,尤其是避免了频繁的创建与销毁对象
2、避免对资源的多重占用(比如写文件操作)
单例模式的缺点:
没有接口
不能继承
与单一职责原则冲突,一个类只应该关心内部逻辑而不关心外面怎样来实例化
单例模式的实现方式:
1. 懒汉模式:
懒汉模式的实现思想与懒加载有些相似,大致意思为:当有对象想要引用单例的实例时再去创建
懒汉模式的java代码实现:
public class SingletonDemo1 {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo1 instance;
//构造器私有化
private SingletonDemo1(){}
//方法同步,调用效率低
public static synchronized SingletonDemo1 getInstance(){
if(instance==null){
instance=new SingletonDemo1();
}
return instance;
}
}
2. 饿汉模式:
饿汉模式大致意思就是:在类加载的时候就去实例化对象,要用的时候直接返回回去
public class SingletonDemo1 {
private static SingletonDemo1 instance = new SingletonDemo1 ;
private SingletonDemo1 (){}
public static SingletonDemo1 getInstance(){
return instance;
}
}
饿汉与懒汉的区别
饿汉模式 | 懒汉模式 | |
---|---|---|
线程安全 | 安全 | 安全 |
调用效率 | 高 | 低 |
是否是延时加载 | 否 | 是 |
3. Double CheckLock实现单例:
DCL也就是双重锁判断机制,也可以理解为懒汉模式的升级版,但是由于JVM底层模型原因,偶尔会出问题,不建议使用:
public class SingletonDemo {
private volatile static SingletonDemo SingletonDemo;
private SingletonDemo() {
}
public static SingletonDemo newInstance() {
if (SingletonDemo == null) {
synchronized (SingletonDemo.class) {
if (SingletonDemo == null) {
SingletonDemo = new SingletonDemo();
}
}
}
return SingletonDemo;
}
}
4. 静态内部类实现模式
此方式线程安全,调用效率高,可以延时加载
public class SingletonDemo {
private static class SingletonClassInstance{
private static final SingletonDemo instance=new SingletonDemo();
}
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return SingletonClassInstance.instance;
}
}
5. 枚举类
public enum SingletonDemo {
//枚举元素本身就是单例
INSTANCE;
//添加自己需要的操作
public void singletonOperation(){
}
如何选用: