单例(singleton)模式, 顾名思义,也就是说类只有一个实例。在计划生育很普遍的今天,我们很容易理解单例模式:首先判断这个家庭是否生了一个孩子,如果没有生,则允许这个家庭生一个,如果已经生了一个,就不能再生孩子了。
如果外界需要知道这个家庭的信息,那么只需要问该家庭的一个孩子就可以了。如果外界需要10询问这个家庭的信息,没有必要问这个家庭的10个孩子。相反,只需要10次问同一个孩子就可以了,可见,有时候,一个孩子已经足够给外界提供信息。很多人说,孩子生得太多了,花销大。这就是单例!
在软件开发中,大多数软件都会有一个本地配置文件。比如一个旅游景点介绍软件,其中就有用户登录的部分,那么用户的本地信息就应当由一个对象(单例)来管理,如果需要对用户本地信息进行读写,就可以用单例来实现。下面是单例模式的代码实现:代码1是C#实现,代码2和3是C++实现 (当然也可以用其他语言实现,比如Objective C等)
代码1:
using System;
class Singleton
{
private Singleton() //将构造函数设置为private,不让外界逼迫Singleton类“生孩子”
{
}
private static Singleton instance;
public static Singleton getInstance()
{
if (null == instance) //if语句确保“只生一个孩子”
instance = new Singleton();
return instance;
}
public string getLoginIdFromDisk() //从本地配置文件中获取用户的登陆号码
{
return "13400001111";
}
}
//为了方便说明和简化程序,类A和B中的loginId设置为public类型
class A
{
public string loginId;
}
class B
{
public string loginId;
}
class Example
{
static void Main()
{
A a = new A();
B b = new B();
//由于上面采用了if (null == instance)方式,故s1和s2其实是同一个对象
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
a.loginId = s1.getLoginIdFromDisk();
b.loginId = s2.getLoginIdFromDisk();
Console.WriteLine("a.loginId is " + a.loginId);
Console.WriteLine("b.loginId is " + b.loginId);
if (s1 == s2)
Console.WriteLine("s1 is the same as s2.");
else
Console.WriteLine("s1 is different from s2.");
}
}
代码2:
#include <iostream>
using namespace std;
class Singleton
{
private:
static Singleton *pInstance;
Singleton() //将构造函数设置为private,阻止外部“生孩子”
{
}
public:
static Singleton *getInstance() //此处的static是让该方法为类方法
{
if(NULL == pInstance)//保证“只生一个孩子”
pInstance = new Singleton;
return pInstance;
}
int getLoginIdFromDisk()
{
return 110;
}
};
class A
{
public:
int loginId;
};
class B
{
public:
int loginId;
};
Singleton* Singleton:: pInstance = NULL; //必要
int main()
{
A a;
B b;
Singleton *p1 = Singleton::getInstance();
Singleton *p2 = Singleton::getInstance();
a.loginId = p1->getLoginIdFromDisk();
b.loginId = p2->getLoginIdFromDisk();
cout << a.loginId << endl;
cout << b.loginId << endl;
if(p1 == p2)
cout << "p1 is the same as p2" << endl;
else
cout << "p1 is different from p2" << endl;
return 0;
}
代码3:
#include <iostream>
using namespace std;
class Singleton;
static Singleton *pInstance = NULL; //静态全局变量
class Singleton
{
private:
Singleton() //将构造函数设置为private,阻止外部“生孩子”
{
}
public:
static Singleton *getInstance() //此处的static是让该方法为类方法
{
if(NULL == pInstance) //保证“只生一个孩子”
pInstance = new Singleton;
return pInstance;
}
int getLoginIdFromDisk()
{
return 110;
}
};
class A
{
public:
int loginId;
};
class B
{
public:
int loginId;
};
int main()
{
A a;
B b;
Singleton *p1 = Singleton::getInstance();
Singleton *p2 = Singleton::getInstance();
a.loginId = p1->getLoginIdFromDisk();
b.loginId = p2->getLoginIdFromDisk();
cout << a.loginId << endl;
cout << b.loginId << endl;
if(p1 == p2)
cout << "p1 is the same as p2" << endl;
else
cout << "p1 is different from p2" << endl;
return 0;
}