C++实现 原型模式(ProToType)

原型模式的意图便是通过已有的对象创建一个新的对象,创建的新的对象和原来的对象具有相同的属性,但是不具有形同的地址空间,也就是说创建的对象应该是深拷贝,而非简单的的拷贝指针。prototype一般主要包括三个方面:

  • ProToType类:抽象基类,声名了克隆自身的接口
  • ConcreteProToTepe(根据实际需求名称有所不同):继承并实现ProTotype中的相应的接口
  • Client:调用接口实现克隆。

结构模型:

在这里插入图片描述
代码示例:

//抽象基类
class ProToType {
public:

    virtual ProToType* clone() = 0;
    virtual ~ProToType() {};
    virtual void print() {};

//只能由其子类创建抽象基类的对象
protected:
    ProToType() {}
};


class ConcreteProTotype_A :public ProToType {
public:
    ConcreteProTotype_A():s(nullptr) {}

    ConcreteProTotype_A(string* s_) :s(s_) { }

    //拷贝构造函数,需要实现深拷贝
    ConcreteProTotype_A(const ConcreteProTotype_A& other):s(new string(*other.s)){ }

    ProToType* clone() {
        return new ConcreteProTotype_A(*this);
    }

    void print() {
        cout << "address:"<<s<<"    value:"<<*s << endl;
    }

    ~ConcreteProTotype_A() {
        if ( s ) {
            delete s;
        }
    }
private:
    string * s;
};

测试客户代码:

 ProToType* p = new ConcreteProTotype_A(new string("this is Type A;"));
ProToType* p1 = p->clone();
p->print();
p1->print();
delete p;
delete p1;

运行结果:
在这里插入图片描述
两者的地址空间不同,但是两者的内容是相同的,说明是深拷贝而非浅拷贝。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值