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;
}