原型模式(Prototype Pattern)

1.定义

原型模式:使用原型实例指定创建对象的类型,并且通过克隆这些原型创建新的对象.原型模式是一种对象创建模式.

2.注意:

通过克隆方法所创建的对象是全新的对象,他们在内存中拥有新的地;通常,对克隆所产生的对象进行的修改不会对原型对象造成任何影响,每一个克隆对象都是相互独立的;通过不同的方式对克隆对象进行修改以后,可以得到一系列相似但不完全相同的对象.

3.结构

(1)Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类.
(2)ConcretePtototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象.
(3)Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象.

注:重要:克隆方法

4.粒子

(1)Prototype.h

#ifndef PROTOTYPE
#define PROTOTYPE
class Prototype {
protected:
    Prototype();
public:
    virtual Prototype* Clone() const = 0;  // return a pointer of a class -----important
    virtual ~Prototype();
};
class ConcretePrototype1:public Prototype {
    public:
        ConcretePrototype1();
        ConcretePrototype1(const ConcretePrototype1&);
        ~ConcretePrototype1();
        virtual Prototype* Clone() const;
};
class ConcretePrototype2:public Prototype {
public:
    ConcretePrototype2();
    ConcretePrototype2(const ConcretePrototype2&);
    ~ConcretePrototype2();
    virtual Prototype* Clone() const;  // important
};
#endif

(2)Prototype.cpp

#include"Prototype.h"
#include<iostream>
using namespace std;

Prototype::Prototype() {
    cout << "Prototype" << endl;
}
Prototype::~Prototype() {
    cout << "~Prototype" << endl;
}
ConcretePrototype1::ConcretePrototype1() {
    cout << "ConcretePrototype1" << endl;
}
ConcretePrototype1::~ConcretePrototype1() {
    cout << "~ConcretePrototype1" << endl;
}
ConcretePrototype1::ConcretePrototype1(const ConcretePrototype1& cp) {
    cout << "ConcretePrototype1 copy" << endl;
}
Prototype* ConcretePrototype1::Clone() const {
    return new ConcretePrototype1(*this);
}
ConcretePrototype2::ConcretePrototype2() {
    cout << "ConcretePrototype2" << endl;
}
ConcretePrototype2::~ConcretePrototype2() {
    cout << "~ConcretePrototype2" << endl;
}
ConcretePrototype2::ConcretePrototype2(const ConcretePrototype2& cp) {
    cout << "ConcretePrototype2 copy" << endl;
}
Prototype* ConcretePrototype2::Clone() const {
    return new ConcretePrototype2(*this);
}

(3)Client.cpp

#include"Prototype.cpp"

int main() {
    Prototype* p1 = new ConcretePrototype1();
    Prototype* p2 = p1->Clone();
    cout << (p1 == p2) << endl;
    cout << endl;
    Prototype* p3 = new ConcretePrototype2();
    Prototype* p4 = p3->Clone();
    cout << (p3 == p4) << endl;
    cout << endl;
    delete p1;
    delete p2;
    cout << endl;
    delete p3;
    delete p4;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值