- Published on
设计模式(4)——原型 Prototype
- Authors
- Name
- Leon
四、Prototype (原型模式,对象创建型模式)
1. 问题:
创建给定类的实例的过程很昂贵或者很复杂时。
2. 意图:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3. 适用:
当创建给定类的实例的过程很昂贵或者很复杂时,就使用原型模式。通过创建类实例对应的 prototype 原型,后续创建类实例就直接调用原型实例的 clone
函数,从原型实例自身拷贝一个实例返回。原型模式是基于从零创建一个对象的成本(复杂程度)远高于直接拷贝对象的成本。
4. 类图:
5. 中间层思考:
原型模式在客户与复杂对象的创建之间添加了一个中间层(原型克隆)。
6. Prototype 思考:
Prototype 模式通过复制原型(Prototype)而获得新对象创建的功能,这里 Prototype 本身就是“对象工厂”(因为能够生产对象),实际上 Prototype 模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder 模式重在复杂对象的一步步创建(并不直接返回对象), AbstractFactory 模式重在产生多个相互依赖的对象,而 Prototype 模式重在从自身复制自己创建新类。
7. 代码实现:
- 编写一个类
Prototype
,类中包含一个克隆函数Clone()
- Clone 方法内生成一个深拷贝自身
this
的对象返回
Prototype.h
// Prototype.h
#pragma once
class Prototype {
public:
virtual ~Prototype();
virtual Prototype* Clone() const = 0;
protected:
Prototype();
private:
};
class ConcretePrototype : public Prototype {
public:
ConcretePrototype();
ConcretePrototype(const ConcretePrototype& cp);
~ConcretePrototype();
Prototype* Clone() const;
protected:
private:
};
Prototype.cpp
//Prototype.cpp
#include "Prototype.h"
#include <iostream>
using namespace::std;
Prototype::Prototype() {}
Prototype::~Prototype() {}
Prototype* Prototype::Clone() const {
return 0;
}
ConcretePrototype::ConcretePrototype() {}
ConcretePrototype::~ConcretePrototype() {}
ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp) {
cout << "ConcretePrototype copy..." << endl;
}
Prototype* ConcretePrototype::Clone() const {
return new ConcretePrototype(*this);
}
main.cpp
// main.cpp
#include "Prototype.h"
#include <iostream>
using namespace::std;
int main(int argc, char* argv[]) {
Prototype* p = new ConcretePrototype();
Prototype* pl = p->Clone();
return 0;
}