现在我们要求定义一个表示总统的类型。presented可以从该类型继承出French present和American present的等类型。这些派生类型都只能产生一个实例
为了设计一个表示总统的类型,并从该类型派生出只能产生一个实例的具体总统(如法国总统和美国总统),我们可以利用单例模式和继承来实现。下面是一个可能的设计方案:
- 定义基类
President
:该基类可以包含一些共有的属性和方法。 - 派生具体总统类
FrenchPresident
和AmericanPresident
:每个派生类都实现单例模式,确保只能有一个实例。
下面是具体的代码实现:
#include <iostream>
#include <memory>
#include <mutex>
// 基类 President
class President {
public:
virtual void showIdentity() const = 0;
protected:
President() {}
virtual ~President() {}
};
// 法国总统 FrenchPresident 类
class FrenchPresident : public President {
public:
static FrenchPresident& getInstance() {
static FrenchPresident instance;
return instance;
}
void showIdentity() const override {
std::cout << "I am the French President." << std::endl;
}
// 删除拷贝构造函数和赋值运算符
FrenchPresident(const FrenchPresident&) = delete;
FrenchPresident& operator=(const FrenchPresident&) = delete;
private:
FrenchPresident() {}
~FrenchPresident() {}
};
// 美国总统 AmericanPresident 类
class AmericanPresident : public President {
public:
static AmericanPresident& getInstance() {
static AmericanPresident instance;
return instance;
}
void showIdentity() const override {
std::cout << "I am the American President." << std::endl;
}
// 删除拷贝构造函数和赋值运算符
AmericanPresident(const AmericanPresident&) = delete;
AmericanPresident& operator=(const AmericanPresident&) = delete;
private:
AmericanPresident() {}
~AmericanPresident() {}
};
int main() {
// 获取法国总统实例
FrenchPresident& frenchPresident = FrenchPresident::getInstance();
frenchPresident.showIdentity();
// 获取美国总统实例
AmericanPresident& americanPresident = AmericanPresident::getInstance();
americanPresident.showIdentity();
// 确保每个类只能有一个实例
FrenchPresident& frenchPresident2 = FrenchPresident::getInstance();
AmericanPresident& americanPresident2 = AmericanPresident::getInstance();
if (&frenchPresident == &frenchPresident2) {
std::cout << "Both FrenchPresident instances are the same." << std::endl;
}
if (&americanPresident == &americanPresident2) {
std::cout << "Both AmericanPresident instances are the same." << std::endl;
}
return 0;
}
解释
- 基类
President
:定义了一个纯虚函数showIdentity()
,使得派生类必须实现该方法。 FrenchPresident
和AmericanPresident
类 :- 实现了单例模式,通过
getInstance()
方法返回类的唯一实例。 - 私有化了构造函数、拷贝构造函数和赋值运算符,以确保无法从外部创建实例或拷贝实例。
- 实现了基类的纯虚函数
showIdentity()
,提供了具体的身份信息。
- 实现了单例模式,通过
main()
函数:展示了如何获取和使用这些单例实例,并验证每个类只能有一个实例。