单例模式

单例模式应该是GoF中最简单的设计模式,它是允许一个类有且仅有一个实例的方法。
所有的类都有构造方法,不显式定义的话系统会默认生成空的构造方法,若有定义的话,默认的构造方法就会失效。如果我们将类的构造方法写成是private的,那么外部程序就不能来实例化它了。
另外拷贝构造函数和复制构造函数被声明为私有,当然也没有实现。
那么怎么使用这个类呢,我们可以写一个public的方法,返回一个类实例,下面的代码中,instance()产生Singleton对象的引用。
如果返回的不是引用指针,用户可能会不小心删除此指针。

#include <iostream>
using namespace std;

class Singleton
{
public:
    static Singleton & instance()
    {
        return s;
    }
    int getValue()
    {
        return i;
    }
    void setValue(int x)
    {
        i = x;
    }
private:
    static Singleton s;
    int i;
    Singleton(int x)
    :i(x)
    {}
    Singleton & operator= (Singleton &);
    Singleton(const Singleton &);
};

Singleton Singleton::s(47);//静态变量类外初始化

int main(void)
{
    Singleton & s = Singleton::instance();
    cout << s.getValue() << endl;
    Singleton & s2 = Singleton::instance();
    s2.setValue(9);
    cout << s.getValue() << endl;
    return 0;
}

这里面还有一个静态变量类外初始化的问题,static 成员变量属于类,不属于某个具体的对象,这就意味着,即使创建多个对象,也只 分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 ,也会影响到其他对象。
static 成员变量必须先初始化才能使用,否则链接错误。
初始化时可以不加 static,但必须要有数据类型。被 private、protected、public 修饰的 static 成员变量都可以用这种方式初始化。
静态成员变量必须初始化,而且只能在类体外进行
单例模式也可以很复杂,因为还有多线程的问题,我也没搞明白。

《C++编程思想》,《大话设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值