我可以创建单例子类吗?

时间:2015-10-28 05:48:29

标签: c++ design-patterns singleton

我有一个父类:

class ParentClass {
public:
    ~ParentClass(){}
    static ParentClass &getInstance() {
        static ParentClass instance;
        return instance;
    }

    void methodA() {
        //do some stuff
    }

    void methodB() {
        //do some stuff
        methodA();
        //do some stuff
    }

private:
    ParentClass(){}
}

我想创建子类:

class ChildClass : public ParentClass {
public:
    ChildClass(){}
    ~ChildClass(){}

    methodA() {
        //do some stuff
    }
}

这段代码有一些明显的问题。首先,我不能以这种方式创建ChildClass(父母的构造函数是私有的)。似乎ChildClass无法直接从ParentClass继承。这些类非常相似。我不想为这些类创建两个相似的副本。

可能我可以为ParentClassChildClass创建一个基类。我不确定但是是否存在一些从单身人士创建孩子的方法?

1 个答案:

答案 0 :(得分:1)

Singleton有一个定义明确的目标。它必须确保当前环境中只存在给定类型的单个实例。

因此,我认为没有任何理由让methodAmethodB在其中。特别是没有人可以创建ParentClass类型的对象,因此无法调用methodAmethodB(除非它们也变为静态)。 我认为更好的OOD是仅使用getInstance()方法创建单例并单独创建ParentClass,其中包含对单例返回的对象的引用:

class SingletonClass {
public:
    ~SingletonClass (){}
    static SingleInstanceClass &getInstance() {
        static SingleInstanceClass instance;
        return instance;
    }

private:
    SingletonClass (){}
}

class ParentClass {
public:
    ParentClass(SingleInstanceClass& ref);
    ~ParentClass(){}

    virtual void methodA() {
        //do some stuff
    }

    void methodB() {
        //do some stuff
        methodA();
        //do some stuff
    }

private:
    SingleInstanceClass& singInstRef;
}

然后

class ChildClass : public ParentClass {
public:
    ChildClass(SingleInstanceClass& ref) : ParentClass (ref){}
    ~ChildClass(){}

    virtual void methodA() {
        //do some stuff
    }
}