您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 最简单的设计模式学习 Singleton模式
最简单的设计模式学习Singleton模式•学习设计模式,自然从最简单的模式入手,而最简单的模式便是Singleton。所以第一篇就来所以说Singleton模式。看完GOF和DesignpatternsinJava的书,感觉Singleton虽然简单,但是想写出一个好的Singleton也不是一上来就能写出来的。•Singleton模式的用处自然是保证一个类只有一个唯一的实例。在建模中涉及到的只能有一个对象,例如Struts中的Action类就是一例。除此之外,Singleton还使得该对象只有一个全局访问点。这就是SIngleton的作用。•说得比较抽象,我们来看一个简单Singleton的C++和Java的代码:•C++Singleton模式:•类定义:•1.classSingleton•2.{•3.public:•4.staticSingleton*Instance();•5.~Singleton();•6.•7.private:•8.Singleton();•9.•10.staticSingleton*instance;•11.};•方法实现:•12.Singleton*Singleton::instance=0;•13.•14.Singleton::Singleton()•15.{•17.}•18.•19.Singleton::~Singleton()•20.{•21.•22.}•23.•24.Singleton*Singleton::Instance()•25.{•26.if(instance==0){•27.instance=newSingleton();•28.}•29.•30.returninstance;•31.}•JavaSingleton模式:•32.publicclassSingleton{•34.privatestaticSingletoninstance;•35.•36.publicstaticSingletongetInstance(){•37.if(instance==null)•38.instance=newSingleton();•39.•40.returninstance;•41.}•42.•43./***//**CreatesanewinstanceofSingleton*/•44.privateSingleton(){•45.}•46.}•通过上面的例子可以看出,Singleton的实现并不难,只要将构造函数访问域设为私有,然后添加一个静态引用和一个获得该应用的静态方法即可。其实在C++中定义一个全局静态变量也可以达到这个效果,但是像Java这样的语言就是能使用Singleton了。•上面的程序有一个问题,就是只能运行在单线程的环境下。为此我在C++上作了个实验。首先#include。在SIngleton::Instance()函数中增加一个Sleep(1000),程序如下:•47.Singleton*Singleton::Instance()•48.{•49.if(instance==0){•50.Sleep(1000);•51.instance=newSingleton();•52.}•53.•54.returninstance;•55.}•然后在主函数中创建两个线程,程序如下:•56.staticSingleton*s1=0,*s2=0;•57.•58.DWORDWINAPIThreadProc1(PVOID)•59.{•60.s1=Singleton::Instance();•61.•62.return0;•63.}•64.•65.DWORDWINAPIThreadProc2(PVOID)•66.{•67.s2=Singleton::Instance();•68.•69.return0;•70.}•71.•72.intmain(intargc,char*argv[])•73.{•74.DWORDthreadID1;•75.DWORDthreadID2;•76.•77.CreateThread(NULL,0,ThreadProc1,NULL,0,&threadID1);•78.CreateThread(NULL,0,ThreadProc2,NULL,0,&threadID2);•79.•80.Sleep(10000);•81.•82.std::couts1s2;•83.•84.return0;•85.}•这样修改后在运行程序,打印出来的s1和s2地址就不是同一个地址了。结果如下:•0372D6800372E68Pressanykeytocontinue•可见当在多线程环境下使用这个Singleton就会出现创建不止一个实力的情况,所以我们需要给Singleton加锁。请看下面的代码。•C++Singleton模式:•86.classSingleton•87.{•88.public:•89.staticSingleton*Instance();•90.virtual~Singleton();•91.•92.private:•93.Singleton();•94.•95.staticCMutexmutex;•96.staticSingleton*instance;•97.};•98.Singleton*Singleton::instance=0;•99.CMutexSingleton::mutex;•100.•101.Singleton::Singleton()•102.{•103.•104.}•105.•106.Singleton::~Singleton()•107.{•108.•109.}•110.•111.Singleton*Singleton::Instance()•112.{•113.mutex.Lock();•114.•115.if(instance==0){•116.Sleep(1000);•117.instance=newSingleton();•118.}•119.•120.mutex.Unlock();•121.•122.returninstance;•123.}•此外需要#includeafxmt.h,,并且在项目设置中要设置动态链接MFC库。•JavaSingleton模式:•124.publicclassSingleton{•126.privatestaticSingletoninstance;•127.privatestaticObjectlock=Singleton.class;•128.•129.publicstaticSingletongetInstance(){•130.synchronized(lock){•131.if(instance==null)•132.instance=newSingleton();•133.•134.returninstance;•135.}•136.}•137.•138./***//**CreatesanewinstanceofSingleton*/•139.privateSingleton(){•140.}•141.}•运用加锁就可以解决在多线程环境下使用Singleton模式所带来的问题了。•java培训
本文标题:最简单的设计模式学习 Singleton模式
链接地址:https://www.777doc.com/doc-3522514 .html