设计模式:单例模式
- 单例模式简介:
- 单例模式是一种创建型的设计模式,提供了一种创建对象的最佳方式
- 意图:保证一个类仅有一个实例对象,并且提供一个访问他的全局访问方法
- 主要解决:一个全局使用的类频繁创建和销毁的问题
- 使用的场景:需要控制实例的数据,节省系统资源的情况
- 单例模式成分
- 私有构造函数 :保证不能通过new等方法创建对象
- 静态方法 :保证可以全局访问方法
- 静态私有自身对象 :唯一实例对象
- 单例模式优缺点
- 优点:内存中只有一个实例,减少了内存的开销,避免对资源的多重占用
- 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样实例化。
- 单例模式实现方式:
- 懒汉式: 线程不安全
public class Singleton { private static Singleton singleton; private Singleton(){ } public static Singleton getInstance(){ if(singleton ==null){ singleton = new Singleton(); } return singleton; } }
- 加锁懒汉式: 线程安全,但是影响效率
public class Singleton { private static Singleton singleton; private Singleton(){ } public static synchronized Singleton getInstance(){ if(singleton ==null){ singleton = new Singleton(); } return singleton; }
- 双检锁 实现复杂,效率慢
public class Singleton { private static Singleton singleton; private Singleton(){ } public static Singleton getInstance(){ if(singleton ==null){ synchronized (Singleton.class) { if(singleton ==null) { singleton = new Singleton(); } } } return singleton; } }
- 饥汉式: 线程安全,执行效率高, 缺点:类加载时就初始化,浪费内存
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return singleton; } }
- 登记式/静态类:线程安全
public class Singleton { private static class SingleHolder{ private static final Singleton INSTANCE = new Singleton(); } private Singleton(){} public static Singleton getInstance(){ return SingleHolder.INSTANCE; } }
- 懒汉式: 线程不安全
- 单例模式思维导图: