《最简单的设计模式学习 Singleton模式.ppt》由会员分享,可在线阅读,更多相关《最简单的设计模式学习 Singleton模式.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、最简单的设计模式学习 Singleton模式学习设计模式,自然从最简单的模式入手,而最简单的模式便是Singleton。所以第一篇就来所以说Singleton模式。看完GOF和Design patterns in Java的书,感觉Singleton虽然简单,但是想写出一个好的Singleton也不是一上来就能写出来的。Singleton模式的用处自然是保证一个类只有一个唯一的实例。在建模中涉及到的只能有一个对象,例如Struts中的Action类就是一例。除此之外,Singleton还使得该对象只有一个全局访问点。这就是SIngleton的作用。说得比较抽象,我们来看一个简单Singleto
2、n的C+和Java的代码:C+Singleton模式:类定义:1.class Singleton2.3.public:4.static Singleton*Instance();5.Singleton();6.7.private:8.Singleton();9.10.static Singleton*instance;11.;方法实现:12.Singleton*Singleton:instance=0;13.14.Singleton:Singleton()15.17.18.19.Singleton:Singleton()20.21.22.23.24.Singleton*Singleton:In
3、stance()25.26.if(instance=0)27.instance=new Singleton();28.29.30.return instance;31.Java Singleton模式:32.public class Singleton 34.private static Singleton instance;35.36.public static Singleton getInstance()37.if(instance=null)38.instance=new Singleton();39.40.return instance;41.42.43./*/*Creates a
4、new instance of Singleton*/44.private Singleton()45.46.通过上面的例子可以看出,Singleton的实现并不难,只要将构造函数访问域设为私有,然后添加一个静态引用和一个获得该应用的静态方法即可。其实在C+中定义一个全局静态变量也可以达到这个效果,但是像Java这样的语言就是能使用Singleton了。上面的程序有一个问题,就是只能运行在单线程的环境下。为此我在C+上作了个实验。首先#include。在SIngleton:Instance()函数中增加一个Sleep(1000),程序如下:47.Singleton*Singleton:Inst
5、ance()48.49.if(instance=0)50.Sleep(1000);51.instance=new Singleton();52.53.54.return instance;55.然后在主函数中创建两个线程,程序如下:56.static Singleton*s1=0,*s2=0;57.58.DWORD WINAPI ThreadProc1(PVOID)59.60.s1=Singleton:Instance();61.62.return 0;63.64.65.DWORD WINAPI ThreadProc2(PVOID)66.67.s2=Singleton:Instance();6
6、8.69.return 0;70.71.72.int main(int argc,char*argv)73.74.DWORD threadID1;75.DWORD threadID2;76.77.CreateThread(NULL,0,ThreadProc1,NULL,0,&threadID1);78.CreateThread(NULL,0,ThreadProc2,NULL,0,&threadID2);79.80.Sleep(10000);81.82.std:cout s1 s2;83.84.return 0;85.这样修改后在运行程序,打印出来的s1和s2地址就不是同一个地址了。结果如下:0
7、372D68 00372E68Press any key to continue可见当在多线程环境下使用这个Singleton就会出现创建不止一个实力的情况,所以我们需要给Singleton加锁。请看下面的代码。C+Singleton模式:86.class Singleton87.88.public:89.static Singleton*Instance();90.virtual Singleton();91.92.private:93.Singleton();94.95.static CMutex mutex;96.static Singleton*instance;97.;98.Sing
8、leton*Singleton:instance=0;99.CMutex Singleton: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=new Singleton();118.119.120.mutex.Unlock();121.122.retu
9、rn instance;123.此外需要#include,并且在项目设置中要设置动态链接MFC库。Java Singleton模式:124.public class Singleton 126.private static Singleton instance;127.private static Object lock=Singleton.class;128.129.public static Singleton getInstance()130.synchronized(lock)131.if(instance=null)132.instance=new Singleton();133.134.return instance;135.136.137.138./*/*Creates a new instance of Singleton*/139.private Singleton()140.141.运用加锁就可以解决在多线程环境下使用Singleton模式所带来的问题了。java培训 http:/