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

Posted 小丑快学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

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

以上是关于C++实现 原型模式(ProToType)的主要内容,如果未能解决你的问题,请参考以下文章

c++ 创建型模式-原型模式(Prototype)

设计模式--原型模式C++实现

设计模式——10.原型模式

设计模式---原型模式

设计模式之原型模式(Prototype)详解及代码示例

JAVA设计模式之原型模式(prototype)