200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 单例模式的四种实现方式(饿汉模式 懒汉模式 静态内部类 枚举类)

单例模式的四种实现方式(饿汉模式 懒汉模式 静态内部类 枚举类)

时间:2021-10-05 18:14:47

相关推荐

单例模式的四种实现方式(饿汉模式 懒汉模式 静态内部类 枚举类)

首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率。接下来就跟着博主的脚步往下走吧~

大多数程序员可能最先接触到的设计模式就是创建模式中的单例模式,单例模式是一种创建型设计模式,是用来创建对象的。

单例模式的核心是无论使用一个类方法多少次,都只产生一个该类对象,这样可以是系统的内存消耗减少一些。

现在回到主题,单例模式的四种实现方式

第一种:饿汉模式-----立即加载的单例模式(最基本的单例模式)

public class Singleton{//创建一个类private Singleton(){}//这个类的构造器,在new时调用private static Singleton sing = new Singleton();//一个静态的属性public static Singleton getInstance(){//提供一个静态方法,返回当前对象return sing;}}

饿汉模式的优缺点:

优点:没有加锁,有较高的执行效率,同时是线程安全的实例。

缺点:饿汉模式在类加载时会直接实例化单例对象,不管有没有使用到该单例对象,那么当我们new出多个对象但没有使用时,就会浪费内存空间。

第二种:懒汉模式--------延迟加载的单例模式

public class LazySingleton{//这是懒汉模式中最简单但是不安全的一种private LazySingleton(){}private static LazySingleton ls = new LazySingleton();private static LazySingleton getInstance(){if(ls == null){//做判断是为了不随便产生多个实例,只有当其为空的时候才产生新的实例return new LazySingleton();}return ls;}}

public class LazySingleton{/*这是懒汉模式中的第二种形式,是线程安全的,但是效率比较低,同时锁的范围太大,会影响程序的执行效率*/private LazySingleton(){}private static LazySingleton ls = new LazySingleton();public static synchronized LazySingleton getInstance(){//加上了同步锁if(ls == null){return new LazySingleton();}return ls;}}

public class LazySingleton{private LazySingleton(){}private static LazySingleton ls = new LazySingleton();public static LazySingleton getInstance(){if(ls == null){//判断对象是否被初始化了synchronized(LazySingleton.class){//没有被初始化就锁住当前类模板if(ls == null){//再一次判断进来的实例是否为空,为空则创建新的实例ls = new LazySingleton();}}}}}

懒汉模式的优缺点:

优点:不会占用内存,是可以达到线程安全的。

缺点:效率会低一些。

第三种:静态内部类

public class InnerSingleton{private InnerSingleton(){}private static class Inner{//静态内部类private static InnerSingleton is = new InnerSingleton();}public static InnerSingleton getInstance(){return Inner.is; }}

静态内部类创建单例模式的优缺点

优点:创建对象是线程安全带的,同时也不需要使用同步锁来获取对象。

第四种:枚举类创建单例模式

public class EnumSingleton{private EnumSingleton(){}private static enum Test{TEST;//自定义的枚举值private static EnumSingleton es = new EnumSingleton();}public static EnumSingleton getInstance(){return Test.es.TEST; }}

枚举类创建单例模式的优点是可以延迟加载,同时是线程安全的。

以上就是单例模式的四种实现方式,如有不对之处还望各位大佬指出,小弟我认真学习~

这周的简易画~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。