场景
软件开发过程中,开发者们常遇到一个问题:我们需要创建许多类实例(类的基本属性相同,但却各有不同的特性)。遇到这种情况,我们可以通过为每个对象创建一个子类来实现,但这样并不是一个好的办法。我们都知道对象复合是比创建子类更加灵活的一种选择。这时我们就可以选择使用原型模式来构建这个类。
定义
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型类提供一个克隆自身的接口。
结构
原型模式对被克隆的目标类进行封装,提供克隆接口。在c++中,我们通过拷贝构造来实现原型模式。模式结构:
- Prototype(抽象接口):声明一个克隆自身的接口。
- ConcretePrototype(具体实现):实现一个克隆自身的操作。
- Client(具体产品):让一个原型克隆自身从而创建一个新的对象。
实现
假设,我们要创建3个颜色不同的盒子,每个盒子的形状大小全都一样。
Prototype:
class Box{
public:
Box(){}
virtual ~Box(){}
virtual Box* clone() = 0;
virtual Init(std::string color) = 0;
};
ConcretePrototype:
class ConcreteBox : public Box{
public:
ConcreteBox(std::string name){m_name = name;}
~ConcreteBox(){}
ConcreteBox(const ConcreteBox& other){m_name = other.m_name;}
Box* clone(){return new ConcreteBox(*this);}
void Init(std::string color){m_color = color;}
void show(){
std::cout << m_color << m_name << std::endl;
}
private:
std::string m_name;
std::string m_color;
};
Client:
int main(){
ConceteBox* pBox = new ConcreteBox("superBox");
pBox->Init("red");
ConceteBox* pConBox = pBox->clone();
pConBox->Init("blue");
pBox->show();
pConBox->show();
return 0;
}