单例模式
单例工厂模式是JAVA中最简单的设计模式之一,提供了一种创建对象的最佳方式。
- 意图:保证一个类仅有一个实例,并提供一个访问他的全局访问点。
- 主要解决:一个全局使用的类频繁的创建和销毁。
- 何时使用:当您想控制实例数目,节省系统资源的时候。
- 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
- 应用实例:一个班级只有一个班主任。
- 优点:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例,避免对资源的多重占用。
- 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
饿汉式(一出生就加载)
先看代码吧:
- 优点:没有加锁,执行效率会提高。
- 缺点:类加载时就初始化,浪费内存。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
懒汉式(需要才会被加载)
改进后的懒汉式方法
public class LazySingleton{
private volatile static EagerSingleton instance = null;
private LazySingleton(){}
public static LazySingleton getInstance(){//构造函数私有化 防止外部创建对象提供一个get方法 让外部通过该方法获取对象
//因为构造函数私有 外部无法通过A a = new A();的方式来创建对象所以只能通过 类名.get();来获取对象
//第一重判断
if(instance==null){//只在创建的时候判断
//锁定代码块
synchronized(LazySingleton.class){//同步代码块,提升效率
//第二重判断
if(instance==null){
instance = new LazySingleton(); //创建单例实例
}
}
}
return instance;
}
}
` 优点:第一次调用才初始化,避免内存浪费。线程安全
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() { //必须加锁 synchronized 才能保证单例,但加锁会影响效率
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}