C++新手学习--单件模式(Singleton Pattern)
单件模式(Singleton Pattern)
关于设计模式,网上有很多相关的书籍。博客园也有很多优秀的文章。
这里,我不再介绍设计模式的详细概念,因为很多人都已经讲了,而且都讲得非常好。请看我整理的这些链接:
http://www.cnblogs.com/rollenholt/category/317053.html
http://www.cnblogs.com/abcdwxc/category/106719.html
http://www.cnblogs.com/lovecherry/archive/2007/10/17/927728.html
http://www.cnblogs.com/jonniexie/category/250714.html
那我为什么还要写这篇博文呢?
本人代码量有限,C++基础也一般。在学习设计模式的时候,感觉阻力很大。对于很多概念的理解,仅仅停在表面。【看了不一定懂,懂了不一定会,会了不一定能用】。参考了网上的一些资料,却发现好多猿友都是用Java或者C#来讨论,也没有给出比较完整的源代码(他们给出了关键代码)。(勿喷,请理解一个新手+菜鸟 的辛酸)。
因此,我觉得我应该写一些设计模式的Demo。通过实际的Demo来加深自己对模式的理解。至少,人家让你写一个模式的时候,你能把这个模式的Demo写出来。尽管这个模式的Demo还有很多漏洞需要完善。但是,写出这个Demo,你已经漂亮地迈出了第一步。。。。。。
适合的读者:1.C++初级菜鸟程序员;2.没有丰富的代码量;3.对设计模式了解不多;
欢迎高手指点。。。。。。。。。
1 #include <iostream> 2 using namespace std; 3 4 class Singleton 5 { 6 private: 7 // private构造函数 8 Singleton() 9 { 10 cout << "创建唯一的实例" << endl; 11 } 12 13 // 私有静态变量,其类型为 Singleton 14 static Singleton *_instance; 15 // 析构函数 16 ~Singleton(); 17 18 public: 19 static Singleton *Instance() 20 { 21 cout << "Singleton::Instance()函数被调用" << endl; 22 23 if (0 == _instance) 24 { 25 _instance = new Singleton(); 26 } 27 return _instance; 28 } 29 30 public: 31 void print() 32 { 33 cout << "Do something!" << endl; 34 } 35 }; 36 37 // static 类型的成员变量是这种语法格式 38 Singleton* Singleton::_instance = 0; 39 40 int main() 41 { 42 Singleton *sg1 = Singleton::Instance(); 43 sg1->print(); 44 45 Singleton *sg2 = Singleton::Instance(); 46 sg2->print(); 47 48 // 通过这两个实例对比,你能看到,Instance()函数被调用了2次,但是Singleton实例只被创建了1次。 49 50 return 0; 51 }
Instance方法保证只有在第一次调用时才会生成Singleton对象,以后的调用只是简单返回唯一的已存在的实例。
程序是在vc6.0的编译器下编译通过。本人假定读者知道怎样把vc6.0里面的代码,转移到vs2008或其他更高版本的vs编译器下面,并让程序编译通过。
对于我,对于初学者,有时候一个东西,如果讲得过深,讲得过于全面,很有可能会让我/初学者抓不到重点。
这是一个Singleton模式的简单C++例子。这个例子也需要花点时间理解的。至少本人现在还在进一步理解这个例子当中。那些需要完善的地方,暂时会缓一缓。。。。。
当然,如果你能完全理解这个例子,你可能会发现,这个例子还有一些地方需要完善。
以下是一些参考博文,已经熟练理解这个Singleton的读者,可以阅读下面的几个链接博文,让你【举一反三】:
http://www.cppblog.com/ant/archive/2007/09/07/31445.html
http://www.cnblogs.com/vimmer/archive/2013/04/03/2998808.html
http://www.cnblogs.com/Daywei/archive/2011/12/27/2303841.html