单例模式

来源:互联网 发布:淘宝千里眼好用不 编辑:程序博客网 时间:2024/06/16 09:23

单例模式:

确保一个类只有一个实例,并提供一个全局访问点。

单例模式类图:


经典单例模式实现:

class Singleton{private:static Singleton *uniqueInstance;Singleton(){}public:static Singleton *getInstance(){if (uniqueInstance == NULL) uniqueInstance = new Singleton();return uniqueInstance;}};
下面来看如何将一个普通的巧克力工厂类转为单例类:

class ChocolateBoiler{private:bool empty;bool boiled;public:ChocolateBoiler(){//这是原来的构造函数empty = true;boiled = false;}void fill(){if (isEmpty()){empty = false;boiled = false;}}void drain(){ //排出煮沸的巧克力和牛奶if (!isEmpty() && isBoiled()) empty = true;}void boil(){//加热if (!isEmpty() && !isBoiled()) boiled = true;}bool isEmpty(){return empty;}bool isBoiled(){return boiled;}};
改成单例类后如下:

class ChocolateBoiler{private:static ChocolateBoiler *uniqueInstance;  //*bool empty;bool boiled;ChocolateBoiler(){//*这是新的构造函数empty = true;boiled = false;}public:static ChocolateBoiler *getInstance(){//*if (uniqueInstance == NULL) uniqueInstance = new ChocolateBoiler();return uniqueInstance;}void fill(){if (isEmpty()){empty = false;boiled = false;}}void drain(){ //排出煮沸的巧克力和牛奶if (!isEmpty() && isBoiled()) empty = true;}void boil(){//加热if (!isEmpty() && !isBoiled()) boiled = true;}bool isEmpty(){return empty;}bool isBoiled(){return boiled;}};

上面的经典单例模式存在多线程安全问题,解决方法参考面试题2:实现单例模式(offer)




0 0
原创粉丝点击