资讯专栏INFORMATION COLUMN

常用设计模式——单例模式

stormgens / 660人阅读

摘要:一单例模式定义单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。技术实现单例模式静态内部类评价使用静态内部类的方式,只有在使用该实例的时候,才去加载静态内部类,从而实现延时加载。

一、单例模式定义:
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

二、实现方式:

懒汉模式

public class Demo {
    // 1、私有构造函数
    private Demo() {}
    // 2、单例实例
    private static Demo instance = null;
    // 3、获取实例接口
    public static Demo getInstance() {
         if(instance == null) {
            synchronized(Demo.class) {
               if(instance == null) {
                  instance = new Demo();
               }
            }
        }
    return instance;
    }
}

评价:延时加载,节约了内存。效率相对低一些。利用同步块实现线程安全。

饿汉模式

public class Singletion {
    private Singletion() {}
    private static Singletion instance = new Singletion(); // Singletion类加载的时候,就初始化这个实例
    public static Singletion getInstance() {
        return instance;
    }
}

评价:程序启动时加载,先加载类,再初始化静态属性,由于后面无法再对对象进行修改,从而实现线程安全,效率相对高一些。占用内存相对多一些。

IoDH技术实现单例模式(静态内部类)

public class Singletion {
private Singletion () {}
    private static class InnerSingletion {
        private static Singletion single = new Singletion();
    }
    
    public static Singletion getInstance(){
        return InnerSingletion.single;
    }
    
}

评价:使用静态内部类的方式,只有在使用该实例的时候,才去加载静态内部类,从而实现延时加载。因为静态内部类只初始化一次,静态内部类的静态属性也只初始化一次,后面无法修改对象的状态,从而实现线程安全。综合了上述两种方法的优点。

三、单例模式的优缺点:
(1)单例模式没有抽象层,因此单例模式的扩展比较困难的。
(2)单例类的职责过重,一定程度上违背了“单一职责原则”。
(3)长时间不使用的单例类可能被系统回收,导致单例对象状态的丢失。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69119.html

相关文章

  • js常用设计模式实现(一)单例模式

    摘要:什么是设计模式设计模式是一种能够被反复使用,符合面向对象特性的代码设计经验的总结,合理的使用设计模式能够让你得代码更容易维护和可靠设计模式的类型共分为创建型模式,结构型模式,行为型模式三种创建型模式创建型模式是对一个类的实例化过程进行了抽象 什么是设计模式 设计模式是一种能够被反复使用,符合面向对象特性的代码设计经验的总结,合理的使用设计模式能够让你得代码更容易维护和可靠设计模式的类型...

    EscapedDog 评论0 收藏0
  • 常用设计模式

    摘要:工厂设计模式工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用关键字实例化对象,通过反射,根据类名称动态创建对象示例静态工厂模式构造方法私有化获取指定类名称的对象动态代理模式动态代理模式,主要用于对同一接口子类的相同逻辑进行代理操作 工厂设计模式 工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用new关键字实例化对象,通过反射,根据类名称动态创建对象 示例: pa...

    fizz 评论0 收藏0
  • java的常用设计模式

    摘要:单例模式单例对象是一种常用的设计模式。使用代理模式,可以将功能划分的更加清晰,有助于后期维护代码如下这几种都是比较常用的设计模式,更多设计模式后期会继续添加。 说起设计模式,很多编程语言的设计模式大同小异,而且设计模式很多,这里就介绍一下java的几种常见的设计模式,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便,所以要降低依赖,降低耦合。先说下设计模式原则...

    omgdog 评论0 收藏0
  • 再遇设计模式之JavaScript篇

    摘要:在面向对象的语言中,比如,等,单例模式通常是定义类时将构造函数设为,保证对象不能在外部被出来,同时给类定义一个静态的方法,用来获取或者创建这个唯一的实例。 万事开头难,作为正经历菜鸟赛季的前端player,已经忘记第一次告诉自己要写一些东西出来是多久以的事情了。。。如果,你也和我一样,那就像我一样,从现在开始,从看到这篇文章开始,打开电脑,敲下你的第一篇文章(或者任何形式的文字)吧。 ...

    Clect 评论0 收藏0
  • Javascript设计模式(三)单例模式

    摘要:单例模式的定义是保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。并且按照单一职责原则类实现功能类管理单例管理单例模式,达到可组合的的效果创建普通类引入代理类惰性单例模式分离创建实例对象的职责与管理单例的职责。 单例模式的定义是:保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。 单例模式是一种常用的模式,有些对象我们往往只需要一个,比如线程池,全局缓存,window对...

    孙吉亮 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<