标签:get 重用 使用场景 turn 没有 情况 关心 安全 基础上
单例模式的定义
在《Java与模式》书中这样说到:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的特点
从单例模式的定义中我们不难发现单例模式有以下特点
单例模式的优点
单例模式的缺点
单例模式的使用场景
说了这么多,现在我们看看单例模式的使用场景。在一个系统中要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,具体场景例如:
单例模式的注意事项
单例模式的具体实现
下面提供几种单例模式的具体实现
/** * 单例模式实现一(饿汉式) * 1.静态实例化对象 * 2.将构造方法私有 * 3.提供静态的公有获取对象方法 * * 特点:加载类时对象已经初始化完毕,占用空间,不适合高并发场景使用 * 私有的构造方法阻挡不了反射机制 */ public class Singleton1 { private static Singleton1 singleton = new Singleton1(); private Singleton1(){}; public static Singleton1 getInstance(){ return singleton; } public void info(){ System.out.println("我是饿汉式"); } } /** * 单例模式实现二(懒汉式) * 1.创建空的静态对象 * 2.私有构造方法 * 3.提供公有的初始化对象方法,添加synchronized互斥锁 * * 特点:只有在调用时才初始化对象,省去不必要的空间占用 * 加了synchronized关键字比较影响执行效率,但保证了线程安全 */ public class Singleton2 { private static Singleton2 singleton = null; private Singleton2(){}; public static synchronized Singleton2 getInstance(){ if(singleton == null){ singleton = new Singleton2(); } return singleton; } public void info(){ System.out.println("我是懒汉式"); } } /** * 单例模式实现三(双重检查锁) * 在单例模式实现二的基础上,添加了volatile关键字修饰静态对象 * 特点:一定程度上优化了直接使用syncronized关键字带来的性能问题 */ public class Singleton3 { private volatile static Singleton3 singleton = null; private Singleton3(){}; public static Singleton3 getInstance() { if(singleton == null){ synchronized (Singleton3.class){ if(singleton == null){ singleton = new Singleton3(); } } } return singleton; } public void info(){ System.out.println("我是双重检查锁"); } } /** * 单例模式实现四(使用类级内部类) * 私有构造方法 * 创建私有的static修饰的内部类-类级内部类 * 在内部类中初始化对象 * 在调用getInstance时初始化SingletonHolder * 特点:由jvw保证线程间同步,类加载机制保证单例 */ public class Singleton4 { private Singleton4(){}; private static class SingletonHolder{ private static Singleton4 singleton = new Singleton4(); } public static Singleton4 getInstance(){ return SingletonHolder.singleton; } public void info(){ System.out.println("我是类级内部类"); } } /** * 单例模式实现五(单元素枚举) * 高效、安全、简洁 * 被称之为最佳实现单例模式的方法 * 特点:利用枚举的特性,巧妙的保证了线程安全、无偿地提供了序列化机制 */ public enum Singleton5 { SINGLETON_5; public void info(){ System.out.println("我是枚举"); } }
总结
设计模式是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。所以无论哪种设计模式,在使用时一定要结合当下情景,然后去选择设计模式,并选择如何实现这一模式。
注:代码片段中的info()方法与单例模式的实现无关,仅仅是为单例类提供一个行为。
标签:get 重用 使用场景 turn 没有 情况 关心 安全 基础上
原文地址:https://www.cnblogs.com/a-dust/p/11240624.html