单例模式
参考《剑指offer》p34.
C#有运行时垃圾回收机制,单例模式很容易实现,如下代码,可以实现多线程单例模式
1 public sealed class Singleton 2 { 3 private Singleton(){} 4 private static Singleton instance=new Singleton(); 5 public static Singleton Instance 6 { 7 return instance; 8 } 9 }
该程序存在的问题是,当调用Singlton类时就会创建实例,而不是在调用Singleton.Instance时创建。
程序改进为按需创建参考《剑指offer》p35.
1 public sealed class Singleton 2 { 3 private Singleton(){} 4 private static Singleton Instance 5 { 6 get 7 { 8 return Nested.instance; 9 } 10 } 11 private class Nested 12 { 13 private static Nested(){} 14 internal static readonly Singleton instance=new Singleton(); 15 } 16 }
C++方法的单例模式
参考自:http://blog.csdn.net/boyxiaolong/article/details/6645681
1 #include <iostream> 2 using namespace std; 3 4 //单例类的C++实现 5 6 class Singleton 7 { 8 private: 9 Singleton();//注意:构造方法私有 10 11 static Singleton* instance;//惟一实例 12 int var;//成员变量(用于测试) 13 14 public: 15 static Singleton* GetInstance();//工厂方法(用来获得实例) 16 int getVar();//获得var的值 17 void setVar(int);//设置var的值 18 virtual ~Singleton(); 19 }; 20 21 //构造方法实现 22 23 Singleton::Singleton() 24 { 25 this->var = 20; 26 cout<<"Singleton Constructor"<<endl; 27 } 28 29 Singleton::~Singleton() 30 { 31 cout<<"Singleton Destructor"<<endl; 32 //delete instance; 33 } 34 35 //初始化静态成员 36 /*Singleton* Singleton::instance=NULL; 37 Singleton* Singleton::GetInstance() 38 { 39 if(NULL==instance) 40 instance=new Singleton(); 41 return instance; 42 }*/ 43 44 Singleton* Singleton::instance=new Singleton(); 45 Singleton* Singleton::GetInstance() 46 { 47 return instance; 48 } 49 50 //seter && getter含数 51 52 int Singleton::getVar() 53 { 54 return this->var; 55 } 56 57 void Singleton::setVar(int var) 58 { 59 this->var = var; 60 } 61 62 //main 63 void main() 64 { 65 Singleton *ton1 = Singleton::GetInstance(); 66 Singleton *ton2 = Singleton::GetInstance(); 67 if(ton1==ton2) 68 cout<<"ton1==ton2"<<endl; 69 cout<<"ton1 var = "<<ton1->getVar()<<endl; 70 cout<<"ton2 var = "<<ton2->getVar()<<endl; 71 ton1->setVar(150); 72 cout<<"ton1 var = "<<ton1->getVar()<<endl; 73 cout<<"ton2 var = "<<ton2->getVar()<<endl; 74 delete Singleton::GetInstance();//必须显式地删除 75 //Singleton *ton3= Singleton::GetInstance(); 76 //cout<<"ton3 var = "<<ton3->getVar()<<endl; 77 }