【创建型】Singleton模式

时间:2021-12-15 07:42:01

单例模式可以说是所有23种设计模式中最为简单的一个,没有之一。其主要思想就是保证整个应用环境中,最多只会有一个对象的实例。类关系图参考如下:

【创建型】Singleton模式

在c++中,单例模式的实现,较为常用的实现方式一般为:

 namespace singleton
{
/**************************************************************************
* create : (jacc.kim) [5-17-2016]
* summary : 单例类
**************************************************************************/
Singleton* Singleton::ms_Instance = nullptr;
class Singleton
{
public:
~Singleton() {}
static Singleton* getInstance() {
if (nullptr == ms_Instance) {
ms_Instance = new (std::nothrow) Singleton();
}
return ms_Instance;
} static void freeInstance() {
if (nullptr != ms_Instance) {
delete ms_Instance;
ms_Instance = nullptr;
}
} private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete; static Singleton* ms_Instance; };//class Singleton }//namespace singleton

常用的单例模式编码结构参考

其实还可以利用模板实现更加通用的单例设计。此种方式又可分为"is-a"形式与"has-a"形式。参考代码如下(以下是先前基于cocos2d-x v3.7版本搭的一个游戏框架中使用的代码):

 #pragma once

 #include "Framework/Foundation/GFGlobalDefine.h"

 NSGF_BEGIN

 /******************************************************************************
* create : (jacc.kim) [8-18-2015]
* summary : class GFHaSingleton
******************************************************************************/
template<typename T>
class GFHaSingleton
{
public:
typedef T TSingletonClass; public:
static TSingletonClass* getInstance();
static void freeInstance(); ~GFHaSingleton() {} private:
static TSingletonClass* sm_Instance; private:
GFHaSingleton();
GFHaSingleton(const GFHaSingleton<T>&) DELETE_METHOD;
GFHaSingleton& operator=(const GFHaSingleton<T>&) DELETE_METHOD; };//class GFHaSingleton /******************************************************************************
* create : (jacc.kim) [8-18-2015]
* summary : class GFIaSingleton
******************************************************************************/
template<typename T>
class GFIaSingleton : public T
{
public:
typedef T TSingletonClass; public:
static GFIaSingleton* getInstance();
static void freeInstance(); virtual ~GFIaSingleton() {} private:
static TSingletonClass* sm_Instance; private:
GFIaSingleton();
GFIaSingleton(const GFIaSingleton<T>&) DELETE_METHOD;
GFIaSingleton& operator=(const GFIaSingleton<T>&) DELETE_METHOD; };//class GFIaSingleton NSGF_END #include "Framework/Foundation/GFSingletonTemplate.inl"

模板形式实现的单例模式编码参考

这种形式的单例使用将是非常方便的。例如:GFHaSingleton<YourClassName>::getInstance()->xxxxxxxx(........);

单例模式在实现应用中是十分频繁的,几乎任何一个项目都必需会用到该模式。值得注意的一点是:我们可以在设计上尽量避免不会产生多于一个的实例,但实际技术上,只要你想,总是有办法创建出多于一个的实例的,这样,例就不再是单例了。就比如前面的第一份参考代码中的 class Singleton; 类,从声明上看,确实只能是有一份实现。但我们可以利用一些高级技术手段创建出N份实例对象来。因此,我们所说的单例,只是在一定的约束下的单例,只是在设计上保证单例。(其实这样在实际项目中就足够了)。

【创建型】Singleton模式的更多相关文章

  1. JAVA设计模式(01):创建型-工厂模式【工厂方法模式】&lpar;Factory Method&rpar;

    简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...

  2. 创建型-生成器模式(Builder)

    1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储 ...

  3. OOAD-设计模式(三)之创建型设计模式(5种)

    前言 前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一.工厂方法模式(Factory Method) 1.1.工厂方法模式概述 工厂方法模 ...

  4. 建造者模式与原型模式&sol;builder模式与prototype模式&sol;创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  5. Java开发中的23种设计模式详解(1)创建型

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. 大话设计模式宏观总结——创建型&amp&semi;amp&semi;结构型&amp&semi;amp&semi;行为型

    师傅验收项目的时候.问大话设计模式那三种类型的差别和联系是什么,顿时我傻了眼.由于除了知道这三种类型分别如何称呼以外.从来都没想过为什么这样划分?于是,我便回答:我没想过这个问题.若是从字面上来理解的 ...

  7. C&num;面向对象设计模式纵横谈——2&period;Singleton 单件&lpar;创建型模式&rpar;

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...

  8. 设计模式学习之单例模式(Singleton&comma;创建型模式)(4)

    假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...

  9. 设计模式(二)单件模式Singleton(创建型)

    SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序*享数据库句柄,因为在保持连接打开或关 ...

  10. &period;NET设计模式 第二部分 创建型模式&lpar;1&rpar;—:单件模式(Singleton Pattern)

    单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...

随机推荐

  1. c&num; 正则提取小例子

    常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'na ...

  2. &lbrack;&period;ashx檔?泛型处理程序?&rsqb;基础入门&num;5&period;&period;&period;&period;ADO&period;NET 与 将DB里面的二进制图片还原 &lpar;范例下载 &amp&semi; 大型控件的ImageField&rpar;

    [.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 & 大型控件的ImageField) http://www.dotblogs.c ...

  3. codeforces 434A A&period; Ryouko&&num;39&semi;s Memory Note&lpar;数学&rpar;

    题目链接: A. Ryouko's Memory Note time limit per test 1 second memory limit per test 256 megabytes input ...

  4. 製程能力介紹&lpar;SPC introduction&rpar; &HorizontalLine; 製程能力的三種表示法

    製程能力的三種表示法 Ck: 準度指標 (accuracy)   Ck=(M-X)/(T/2) Cp: 精度指標 (precision)   Cp=T/(6σp) 規格為單邊時:Cp=(Tu-X)/3 ...

  5. IAR Embedded Workbench for ARM 6&period;50&period;6 &amp&semi; 6&period;60&period;1 破解补丁

    IAR EWARM 6.50.6 & 6.60.1 破解 破解原理和方法见:http://blog.csdn.net/chivalrys/article/details/8564568 IAR ...

  6. ClassLoader载入指定的类需注意六个细节或报ClassNotFundEception异常总结

    项目中,载入指定的类反射调用方法一直报类找不到,经过数百次的測试.对这样的问题有了一个又一次的认识,特总结.记录.分享例如以下: 1.路径中尽可能用"/"或者File.separa ...

  7. R绘图学习笔记

    R软件作图学习,首先为了体验方便,我使用的R中MASS包中的自带数据集,首先加载该包 > library(MASS) 加载数据集,该数据集事保险数据统计 > data("Insu ...

  8. eclipse中的tomca的编辑页面server location灰色

    clipse中tomcat service设置 选择window ----show view---services可以看到服务的面板 双击tomcat进入配置界面Service Locations(S ...

  9. Nginx 分析access日志文件

    Nginx Access Log日志统计分析常用命令 IP相关统计 统计IP访问量 awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时 ...

  10. 初探FFT(快速傅里叶变换)

    第一次接触省选的知识点呢!zrf大佬在课堂上讲的非常清楚,但由于本蒟蒻实在太菜了,直接掉线了.今天赶紧恶补一下. 那么这篇博客将分为两块,第一块是FFT的推导和实现,第二块则是FFT在OI上的应用 因 ...