※设计模式※→☆创建型模式☆============Singleton模式(一)

模式概述

        个人认为 Singleton模式是所有设计试中最简单,最常见,也是最容易实现的,因此,设计模式就先从 Singleton模式开始说起吧!对于开发人员来说也是最应该熟悉和把握的模式。因此,此模式在招聘的现场上出现的概率是极高的。面试官为考察面试者对设计 的基本了解和掌握,经常会问 “设计模式中的单键模式用来解决什么问题?如何实现?”

 

        Singleton模式,顾名思义,Singleton就是确保一个类只有唯一的一个实例。Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton模式,最常见的比如我们希望整个应用程序中只有一个连接数据库的Connection实例;又比如要求一个应用程序中只存在某个用户数据结构的唯一实例。我们都可以通过应用Singleton模式达到目的。

       

       那我们如何去创建一个唯一 的变量(对象)呢?我们很容易的一个想法就是创建一个全局的变量(对象),当然这个答案是肯定的,同时也是不大推荐的。详细后面会讨论Singleton模式与全局变量的一些对比。 

 

Singleton模式由以下角色组成

  • 单例(Singleton)角色:确保一个类只有唯一的一个实例

模式结构

       Singleton 模式的结构图如下:

                                      

       在Singleton模式的结构图里,私有化构造函数使该类无法从外部实例化。我们使用 “static Singleton* m_pInstance;” 来确保及维护当前的唯一对象。提供二个Static方法 ”static Singleton* Instance();“ ”static VOID Destroy();“来申请和释放对象。这样,可以通过Static方法 ”static Singleton* Instance();“来获取唯一实例了。

 

       按惯例,我个人习惯是喜欢把拷贝构造函数和赋值函数私有化,并不对其进行实现。以避免一些不必要的麻烦,如果确实是需要使用拷贝构造函数和赋值函数时,再进行一些相关具体情况的处理。

 

 

 

 

模式讨论

       Singleton模式在开发中的使用频率是非常高的,经常用于一些工厂,某个模块外部接口等仅只需要一个实例的情况。
例如:在游戏开发中,我们只需要一个Game Control 来驱动游戏过程时,就可以把Game Control 用Singleton模式来进行处理。或者某个接口也可以用Singleton模式,早于是,我们可能经常看到类似 XXXIF::Instance() 的代码。
 
 

这里我们讨论下Singleton模式与全局变量。

 

 

 

 

全局变量
全局变量是最容易引起初学者兴趣的了,在整个项目中,任何一个函数,每一行代码都可以轻易访问所有的全局变量,并且可以不用付出额外的代价,全局变量看起来就像是为懒惰的程序员设计的一条绿色通道,如果不想看到函数因为要与其他模块通信而动辄很多参数,或者像给程序始末的关键信息寻找一个最合适的存储位置,那么全局变量就是很好的解决方案。但是在项目中,全局变量肯定不少,这个时候,使用起来就会比较混乱,这个时候有一种方法就是创建一个类,其中都是可以使用的全局变量,当需要使用时,直接在类中添加就可以了,这个模式还是很好的,但是仍然有很多麻烦事。
1.首先就是变量名的冲突,这个问题会使项目管理的成本大大增加,项目经理必须小心维护变量名规则,必须分析每一个变量的模块,
2.还有肯定就是耦合度的问题了,这个全局变量大大增加了函数和模块之间的耦合度,访问某个全局变量的多个函数被该变量牢牢结合在一起,无法拆分开来
3.多线程访问也是问题,当多个并发的线程都需要访问某些全局变量的时候,我们必须使用各种同步机制来保护这些变量,防止陷入并发冲突的泥潭

Singleton模式
Singleton模式是创建型模式的一种,从一定程度上说,它可以成为全局变量的替代品,它的设计意图是,保证一个类只有一个对象实例,并提供一个访问的方法,这个时候我们可以将数据封装在一个特殊的类中,然后这个类严格管理它的数据的唯一性,不允许程序员随意创建这个类的对象实例(将构造器不公有化就可以了),便可以用它的静态成员函数得到类的唯一对象实例数据。


使用Singleton类最容易犯的错误就是按照以前的结构化程序设计的思路考虑问题,将全局变量作为模块之间共享数据的一个桥梁,把它们收集起来,放进一个单间类,这肯定是不对的,而应该是从系统中寻找那些类的特性,生存周期较长的类,改成单间类的形式,生存周期短的就封装在一个需要使用的类中,便可以解决类似问题。


最后,无论模式多么优越,我们也需要根据实际的具体情况而慎重考虑。

 

 

 

模式实现

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。
本节笔记到这里就结束了。

潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
游戏开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。
如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢你们一直的支持~~~
 

       C++完整个代码示例(代码在VS2005下测试可运行)

代码及相关下载地址:

http://download.csdn.net/detail/xiaoting451292510/4903367

DesignPattern.cpp

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// DesignPattern.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "Singleton.h"




int _tmain(int argc, _TCHAR* argv[])
{
#if DEBG_TEST_SINGLETON
Singleton* pSingletonA = NULL;
Singleton* pSingletonB =  NULL;

pSingletonA = Singleton::Instance();
pSingletonB = Singleton::Instance();


Singleton::Destroy();
Singleton::Destroy();
#endif




return 0;
}
 

 

Singleton.h 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/**
  @file     Singleton.h
  @brief     To ensure that a class has only one instance
  @author   arvin
  @version 1.0   2012/12/12
 */


#ifndef CXX_DESIGNPATTERN_SINGLETON_H
#define CXX_DESIGNPATTERN_SINGLETON_H


class Singleton
{
public:
/**
* Destruction
*
* @param VOID
* @return 
*/
~Singleton();


/**
* Instance
*
* @param VOID
* @return singleton*
* @note singleton
*/
static Singleton* Instance();

/**
* Destroy
*
* @param VOID
* @return VOID
* @note singleton
*/
static VOID Destroy();
protected:
private:
/**
* Construction
*
* @param VOID
* @return 
*/
Singleton();


/**
* Copy Construction
*
* @param VOID
* @return 
*/
Singleton(const Singleton& cSingleton);


/**
* Assignment
*
* @param VOID
* @return Singleton&
*/
Singleton& operator=(const Singleton& cSingleton);


public:
protected:
private:
static Singleton* m_pInstance;
};
#endif /* >>CXX_DESIGNPATTERN_SINGLETON_H<< */
/* EOF */

 

Singleton.cpp 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/**
  @file     Singleton.cpp
  @brief     To ensure that a class has only one instance
  @author   arvin
  @version 1.0   2012/12/12
 */
#include "stdafx.h"


#ifndef CXX_DESIGNPATTERN_SINGLETON_H
#include "Singleton.h"
#endif


Singleton* Singleton::m_pInstance = NULL;




/**
* Construction
*
* @param VOID
* @return 
*/
Singleton::Singleton()
{
#if DEBG_TEST_SINGLETON
static WORD i = 0;
cout<<"Construction Singleton:"<<++i<<endl;
#endif
}


/**
* Destruction
*
* @param VOID
* @return 
*/
Singleton::~Singleton()
{
#if DEBG_TEST_SINGLETON
static WORD i = 0;
cout<<"Destruction Singleton:"<<++i<<endl;
#endif
}


/**
* Instance
*
* @param VOID
* @return Singleton*
* @note Singleton
*/
Singleton* 
Singleton::Instance()
{
if (NULL == m_pInstance) {
m_pInstance = new Singleton;
}
return m_pInstance;
}




/**
* Destroy
*
* @param VOID
* @return VOID
* @note singleton
*/
VOID 
Singleton::Destroy()
{
if (NULL != m_pInstance) {
delete m_pInstance;
m_pInstance = NULL;
}
}


/* EOF */

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值