c++ 创建型模式-单例模式(Singleton)

1) 意图:

保证一个类仅有一个实例,并且提供一个访问它的全局访问点

2) 结构:

  其中:

    Singleton提供一个instance操作,这是其他客户访问该类的唯一实例。

  保证唯一实例有以下操作:

    1. 构造函数和析构函数不对外开放
    2. 声明一个对外公开的静态函数作为访问该类的唯一接口
    3. 单例函数中声明一个静态的类指针,且做好锁保护

3) 适用性:

  1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
  2. 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时

4) 举例:

这里举例分两个,一个单例,一个多例,多例就是一个类可以根据参数不同构建不同的实例,但这些个实例也是唯一的。

  1. 单例
 1 class  Singleton
 2 {
 3 private:
 4     Singleton() {}
 5     virtual ~Singleton() {}
 6 public:
 7     static Singleton* instance()
 8     {
 9         static Singleton* Instance;
10         if (Instance == NULL)
11         {
12             static CMutex Mutex;
13             Mutex.Lock();
14             if (Instance == NULL)
15             {
16                 Instance = new Singleton();
17             }
18             Mutex.Unlock();
19         }
20         return Instance;
21     }
22 };

  2. 多例

 1 std::map<int, Singleton*> Singleton::s_map;
 2 class  Singleton
 3 {
 4 private:
 5     Singleton(int num):m_num(num) {}
 6     virtual ~Singleton() {}
 7 public:
 8     static Singleton* instance(int num)
 9     {
10         for (std::map<int, Singleton*>::iterator it = s_map.begin();
11             it != s_map.end(); ++it)
12         {
13             if (it->first == num)
14             {
15                 return it->second;
16             }
17         }
18         static CMutex Mutex;
19         Mutex.Lock();
20         Singleton* Instance = new Singleton(num);
21         s_map.insert(std::map<int, Singleton*>::value_type(num, Instance));
22         Mutex.Unlock();
23         return Instance;
24     }
25 private:
26     static std::map<int, Singleton*> s_map;
27     int m_num;
28 };

原文地址:https://www.cnblogs.com/ho966/p/12229926.html

时间: 2024-07-30 22:06:45

c++ 创建型模式-单例模式(Singleton)的相关文章

6 创建型模式-----单例模式

模式动机:对于系统中的某些类而言,确保只有一个实例运行很重要,例如一个系统只能有一个计时器或者ID生成器. 模式定义(Singleton Pattern):确保一个类只有一个实例,并且该类自己负责创建它自己的唯一实例,而且还必须可以向系统提供这个实例. 模式结构图: 模式分析:单例类拥有一个私有构造函数,确保用户无法通过new关键字创建它:模式中包括一个静态工厂方法和一个静态(确保唯一性)私有变量,该静态方法: 1> 负责实例化自己,然后存储到静态变量中: 2> 提供系统可访问的接口.   模

&quot;围观&quot;设计模式(7)--创建型之单例模式(Singleton Pattern)

单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概念比较简单,他的目的就是只允许出现一个该类的实例,经常在JD

设计模式(创建型模式)——单例模式

1.定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.适用性 1)当类只能有一个实例而客户可以从一个众所周知的访问点访问它时. 2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 3.结构 图1 单例模式类图 注: Singleton:定义一个Instance操作,允许客户访问它的唯一实例.Instance是一个类操作(C#中为静态方法),Singleton负责创建它自己的唯一实例. 4.实现方法 1)经典模式 静态变量uniqueIn

设计模式(创建型模式-单例模式)

定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类 单例模式的特点: 单例类只可有一个实例(不能通过new来创建对象) 单例类必须自已创建自已这唯一的实例 单例类必须给所有其它对象提供这一实例 单例模式的适用条件: 在一个系统要求一个类只有一个实例时,才应当使用单例模式.反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例类. 类中没有属性,只有方法 1.饿汉式单例  public class Singleton { private static

创建型模式--单例模式

 一个类仅有一个实例,并提供一个访问它的全局访问点. 适用场所: 当类只能有一个实例而且适用者可以从一个访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 类图:                                               代码描述: <pre name="code" class="java">/** * 定义一个Instance操作,允许客户访问它的唯一实例. *

创建型模式--(再论)单例模式

在创建型模式--单例模式 一文中我们提到单例模式,就是 一个类仅有一个实例,并提供一个访问它的全局访问点. 那么问题来了,我们以上一篇中代码为例: <pre name="code" class="java">/** * 定义一个Instance操作,允许客户访问它的唯一实例. * Instance是一个类操作. * 负责创建它自己的唯一实例. * @author Linhai Gu * */ public class Singleton { privat

设计模式(四) : 创建型模式--单例模式

单例模式的话,类图上来看是最简单的设计模式,就是一个类只能有一个自己的实例. 单例模式通常来说我们就有Lazy loading的和不是Lazy loading的.<java与模式>里面的关于这两种的类图,: 可以看到一个是现开始就实例话的,这样的话不符合我们的lazy loading,还有一种是在getinstance方法里头去new的,这样的话会有线程安全的问题,我们提供了双重检查锁. 下面看示意代碼︰ 1. 静态初始化: package com.javadesignpattern.Sing

Java设计模式——单例模式(创建型模式)

概述 ??单例模式保证对于每一个类加载器,一个类仅有一个实例并且提供全局的访问.其是一种对象创建型模式.对于单例模式主要适用以下几个场景: 系统只需要一个实例对象,如提供一个唯一的序列号生成器 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例 ??单例模式的缺点之一是在分布式环境中,如果因为单例模式而产生 bugs,那么很难通过调试找出问题所在,因为在单个类加载器下进行调试,并不会出现问题. 实现方式 ??一般来说,实现枚举有五种方式:饿汉式.懒汉式.双

3创建型模式之单例模式

概念 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. GoF对单例模式的定义是:保证一个类.只有一个实例存在,同时提供能对该实例加以访问的全局访问方法. 为什么使用单例模式? 在应用系统开发中,我们常常有以下需求: - 在多个线程之间,比如初始化一次socket资源:比如servlet环境,共享同一个资源或者操作同一个对象 - 在整个程序空间使用全局变量,共享资源 - 大规模系统中,为了性能的考虑,需要节省对