精讲设计模式-单例模式(Singleton模式)

1、问题

        个人认为 Singleton 模式是设计模式中最为简单、最为常见、最容易实现,也是最应该 熟悉和掌握的模式。且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的 最多的就是 Singleton 模式。

        Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于 对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合 的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇 到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现了,可能这也 正是很多公司在招聘 Java 开发人员时候经常考察 Singleton 模式的缘故吧。

        Singleton 模式在开发中非常有用,具体使用在讨论给出。

2、模式选择

        Singleton 模式典型的结构图为:

         在 Singleton 模式的结构图中可以看到,我们通过维护一个 static 的成员变量来记录这 个唯一的对象实例。通过提供一个 staitc 的接口 instance 来获得这个唯一的实例。

3、实现

        完整代码示例(code) Singleton 模式的实很简单,这里为了方便初学者的学习和参考,将给出完整的实现代 码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)

//代码片断 1:Singleton.h 

//Singleton.h 
#ifndef _SINGLETON_H_ 
#define _SINGLETON_H_ 
#include <iostream> 
using namespace std; 
class Singleton
{ 
public: 
static Singleton* Instance(); 
protected: 
 Singleton(); 
private: 
static Singleton* _instance; 
}; 
#endif //~_SINGLETON_H_
//代码片断 2:Singleton.cpp 

//Singleton.cpp
#include "Singleton.h" 
#include <iostream> 
using namespace std; 
Singleton* Singleton::_instance = 0; 
Singleton::Singleton() 
{ 
 cout<<"Singleton...."<<endl; 
} 
Singleton* Singleton::Instance()
{ 
if (_instance == 0) 
 { 
 _instance = new Singleton(); 
 } 
 return _instance; 
}
//代码片断 3:main.cpp 

//main.cpp 
#include "Singleton.h" 
#include <iostream> 
using namespace std; 
int main(int argc,char* argv[])
{ 
Singleton* sgn = Singleton::Instance(); 
 return 0;
}

代码说明:

        Singleton 模式的实现无须补充解释,需要说明的是,Singleton 不可以被实例化,因此我们将其构造函数声明为 protected 或者直接声明为 private。

4、讨论

        Singleton 模式在开发中经常用到,且不说我们开发过程中一些变量必须是唯一的,比 如说打印机的实例等等。 Singleton 模式经常和 Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象 一般来说只要一个,笔者在开发 Visual CMCS 的时候,语义分析过程(以及其他过程)中 都用到工厂模式来创建对象(对象实在是太多了),这里的工厂对象实现就是同时是一个 Singleton 模式的实例,因为系统我们就只要一个工厂来创建对象就可以了,Singleton 模式在开发中经常用到,且不说我们开发过程中一些变量必须是唯一的,比 如说打印机的实例等等。 Singleton 模式经常和 Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象 一般来说只要一个,笔者在开发 Visual CMCS 的时候,语义分析过程(以及其他过程)中 都用到工厂模式来创建对象(对象实在是太多了),这里的工厂对象实现就是同时是一个 Singleton 模式的实例,因为系统我们就只要一个工厂来创建对象就可以了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值