C++原型模式

   原型模式实现方式

     原型模式的结构

  1. 抽象原型类:规定了具体原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 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++中,强制类型转换通常有以下几种形式:

  1. 静态转换(static_cast):用于基本类型之间的转换,以及具有继承关系的指针或引用之间的转换。
  2. 动态转换(dynamic_cast):用于具有继承关系的指针或引用之间的转换,会进行运行时类型检查。
  3. 常量转换(const_cast):用于去除常量属性。
  4. 重新解释转换(reinterpret_cast):用于不同类型之间的二进制位级别的转换。

虽然可以使用强制类型转换将一种类型转换为另一种类型,但是需要注意以下几点:

  1. 强制类型转换可能会造成数据丢失或精度损失。
  2. 强制类型转换可能会导致未定义的行为或不安全的操作。
  3. 在进行指针类型之间的转换时,需要确保类型之间是兼容的,否则可能会导致程序崩溃或内存泄漏等问题。

因此,虽然可以使用强制类型转换来实现某些特定的需求,但是需要谨慎使用,避免造成不可预测的后果。最好遵循类型安全原则,尽量避免使用强制类型转换。

问题2:原型模式叫法的由来 

 原型模式是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。这种方式可以提高对象的创建效率,并且可以避免直接使用构造函数来创建对象,从而减少对类的依赖。

原型模式的名称来源于生物学中的原型概念,即某个事物的原始模型或样本。在设计模式中,原型模式也类似地指代一个对象作为其他对象的原型,通过复制这个原型对象来创建新的对象。因此,原型模式得名于生物学中的原型概念,用以表示对象的复制和创建过程。

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。它通常用于解决两个已有接口之间不兼容的问题。 在给出的代码示例中,我们可以看到适配器模式的应用。在Main.cpp文件中,创建了一个Target对象指针target,并将其初始化为Adapter对象。然后调用target的request()函数,实际上调用的是Adapter的request()函数。而Adapter的request()函数内部调用了Adaptee的specificRequest()函数,完成了适配的过程。 在Head.h文件中定义了三个类:Target、Adaptee和Adapter。Target类是适配器模式中的目标接口,定义了一个虚函数request()。Adaptee类是被适配的类,它有一个特殊的请求函数specificRequest()。Adapter类是适配器类,它继承了Target类,并在其request()函数中调用了Adaptee类的specificRequest()函数。 通过适配器模式,我们可以将不兼容的两个接口进行适配,使它们能够协同工作。这在软件开发中经常用于复用已有代码或集成多个系统。 参考: C++设计模式之适配器模式Adapter Head.cpp Main.cpp<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++设计模式之适配器模式(Adapter)](https://download.csdn.net/download/weixin_38666785/12761879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++设计模式-适配器模式](https://blog.csdn.net/qq78442761/article/details/95766831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值