原型模式实现方式
原型模式的结构
- 抽象原型类:规定了具体原型对象必须实现的接口。
- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
- 访问类:使用具体原型类中的 clone() 方法来复制新的对象。
//父类
class Prototype {
protected:
string prototype_name_;
float prototype_field_;
public:
Prototype() {}
Prototype(string prototype_name)
: prototype_name_(prototype_name) {//prototype_name_初始化为prototype_name
}
virtual ~Prototype() {}//析构函数
virtual Prototype* Clone() const = 0;//纯虚函数,使用必须重写
virtual void Method(float prototype_field) {//虚函数,允许被重写
this->prototype_field_ = prototype_field;
std::cout << "Call Method from " << prototype_name_ << " with field : " << prototype_field << std::endl;
}
};
//子类
class Realizetype1 : public Prototype {
private:
float realize_prototype_field1_;//在父类的基础上添加的自己的东西
public:
Realizetype1(string prototype_name, float concrete_prototype_field)//有参构造函数
: Prototype(prototype_name), realize_prototype_field1_(concrete_prototype_field) {
}
/**
* 注意,Clone 方法返回一个新的克隆对象的指针,调用者必须释放其内存。
*/
Prototype* Clone() const override {
return new Realizetype1(*this);
}
};
class Realizetype2 : public Prototype {
private:
float realize_field2_;
public:
Realizetype2(string prototype_name, float concrete_prototype_field)
: Prototype(prototype_name), realize_field2_(concrete_prototype_field) {
}
Prototype* Clone() const override {
return new Realizetype2(*this);
}
};
int main()
{
Realizetype1 sxz("object1", 1000);
Realizetype2 zbj("object2", 800);
Realizetype1* s1 =(Realizetype1*) sxz.Clone();
Realizetype2* z2 = (Realizetype2*)zbj.Clone();
s1->Method(1000);
z2->Method(800);
delete []s1;
delete[]z2;
return 0;
}
问题1:强制类型转换有哪些使用条件
强制类型转换是一种将一种数据类型转换为另一种数据类型的操作,但是并不是所有类型之间都可以随意进行强制类型转换。在C++中,强制类型转换通常有以下几种形式:
- 静态转换(static_cast):用于基本类型之间的转换,以及具有继承关系的指针或引用之间的转换。
- 动态转换(dynamic_cast):用于具有继承关系的指针或引用之间的转换,会进行运行时类型检查。
- 常量转换(const_cast):用于去除常量属性。
- 重新解释转换(reinterpret_cast):用于不同类型之间的二进制位级别的转换。
虽然可以使用强制类型转换将一种类型转换为另一种类型,但是需要注意以下几点:
- 强制类型转换可能会造成数据丢失或精度损失。
- 强制类型转换可能会导致未定义的行为或不安全的操作。
- 在进行指针类型之间的转换时,需要确保类型之间是兼容的,否则可能会导致程序崩溃或内存泄漏等问题。
因此,虽然可以使用强制类型转换来实现某些特定的需求,但是需要谨慎使用,避免造成不可预测的后果。最好遵循类型安全原则,尽量避免使用强制类型转换。
问题2:原型模式叫法的由来
原型模式是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。这种方式可以提高对象的创建效率,并且可以避免直接使用构造函数来创建对象,从而减少对类的依赖。
原型模式的名称来源于生物学中的原型概念,即某个事物的原始模型或样本。在设计模式中,原型模式也类似地指代一个对象作为其他对象的原型,通过复制这个原型对象来创建新的对象。因此,原型模式得名于生物学中的原型概念,用以表示对象的复制和创建过程。