首页 > 其他分享 >设计模式之:1单例模式

设计模式之:1单例模式

时间:2023-09-13 19:56:09浏览次数:34  
标签:Singleton 模式 instance 实例 static private 单例 设计模式

1  单例模式

1.1      引言

单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。

1.2      经典模式

public class Singleton
{
        private static Singleton instance;
        private Singleton(){}
        public static Singleton GetInstance()
        {
                if(instance==null)
                {
                     instance=new Singleton();
                }
                return instance;
        }
}

  解析如下:

  1)首先,该Singleton的构造函数必须是私有的,以保证客户程序不会通过new()操作产生一个实例,达到实现单例的目的;

  2)因为静态变量的生命周期跟整个应用程序的生命周期是一样的,所以可以定义一个私有的静态全局变量instance来保存该类的唯一实例;

  3)必须提供一个全局函数访问获得该实例,并且在该函数提供控制实例数量的功能,即通过if语句判断instance是否已被实例化,如果没有则可以同new()创建一个实例;否则,直接向客户返回一个实例。

  在这种经典模式下,没有考虑线程并发获取实例问题,即可能出现两个线程同时获取instance实例,且此时其为null时,就会出现两个线程分别创建了instance,违反了单例规则。因此,需对上面代码修改。

1.3      多线程下的单例模式

1.3.1     Lazy(懒汉)模式

 public class Singleton
 {
        private static Singleton _instance;
        private static readonly object _lock = new object();
        private Singleton() { }
        public static Singleton GetInstance()
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                 }
            }
            eturn _instance;
          }
}

  上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。

1.3.2       饿汉模式

  这种模式的特点是自己主动实例。

public sealed class Singleton
{
        private static readonly Singleton instance=new Singleton();
        private Singleton(){}
        public static Singleton GetInstance()
        {
              return instance;
        }
}

  上面使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。

1.4      单例模式的优缺点:

l   优点: 只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等;

l   缺点:就是不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

标签:Singleton,模式,instance,实例,static,private,单例,设计模式
From: https://www.cnblogs.com/terryK/p/17700581.html

相关文章

  • 【设计模式】状态模式State:通过有限状态机监控功能的 "状态变化"
    (目录)状态模式的应用场景非常广泛,比如:线上购物订单、手机支付、音乐播放器、游戏、工作流引擎等场景。状态模式设计的初衷是应对同一个对象里不同状态变化时的不同行为的变化。模式原理原始定义是:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了自己的......
  • 【设计模式】策略模式Strategy:解决不同活动策略营销推荐场景
    (目录)模板方法模式能帮助我们进行公有方法的抽取,起到快速复用和扩展的作用。另一种快速复用和扩展代码的行为型模式:策略模式。策略模式在实际的开发中很常用,最常见的应用场景是利用它来替换过多的if-else嵌套的逻辑判断。除此之外,还能结合工厂模式给客户端提供非常灵活的使......
  • 三级模式结构
        ......
  • 设计模式-观察者模式
    设计模式提供了软件开发过程中的一些最佳实践,可以帮助我们解决常见的编程问题,提高软件的可维护性和可复用性,并使我们的代码更加健壮和灵活。设计模式可以带来以下好处:提高代码的可读性和可维护性、提高软件的可复用性、提高开发效率、提高系统的灵活性和可扩展性。今天我们讲一下观......
  • 工厂方法模式
    当设计应用程序时,对象的创建过程是一个关键的考虑因素。工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,用于解决对象的创建与客户端代码之间的紧耦合问题。通过引入一个工厂接口和多个具体工厂类,工厂方法模式将对象的创建过程抽象化,使得客户端代码无需直接实例化对象,而......
  • Redis哨兵模式详解
    目录Redis哨兵模式定义为什么需要Redis哨兵模式?Redis哨兵模式功能Redis哨兵模式原理Redis哨兵模式的优缺点 Redis哨兵模式定义Redis哨兵模式是是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移,是Redis实现高可用的实现方案。 为什么需要Red......
  • 《精通Python设计模式》 PDF电子书 +源码
    第1章工厂模式第2章建造者模式第3章其他创建型模式第4章适配器模式第5章装饰器模式第6章桥接模式第7章外观模式第8章其他结构型模式第9章职责链模式第10章命令模式第11章观察者模式第12章状态模式第13章其他行为型模式第14......
  • 单例模式
    面向对象编程中,单例模式是一个经常被讨论的话题。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一种全局访问点来获取该实例。在本篇博客中,我们将深入探讨单例模式的重要概念、实现方式、以及何时使用它。什么是单例模式?单例模式是一种确保在整个应用程序中......
  • 观察者模式
    观察者模式,也称发布订阅模式,主题方发布,观察方订阅。observe.h/***Copyright(C)2023-09-1314:06zxinlog<[email protected]>**/#include<func.h>#include<iostream>#include<list>usingstd::cout;usingstd::endl;usingstd::list;classObserve......
  • 03-开发环境介绍_交互模式的使用_IDLE介绍和使用
       ......