Published on

设计模式(4)——原型 Prototype

Authors
  • avatar
    Name
    Leon
    Twitter

四、Prototype (原型模式,对象创建型模式)

1. 问题:

  创建给定类的实例的过程很昂贵或者很复杂时。

2. 意图:

  用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

3. 适用:

  当创建给定类的实例的过程很昂贵或者很复杂时,就使用原型模式。通过创建类实例对应的 prototype 原型,后续创建类实例就直接调用原型实例的 clone 函数,从原型实例自身拷贝一个实例返回。原型模式是基于从零创建一个对象的成本(复杂程度)远高于直接拷贝对象的成本。

4. 类图:

5. 中间层思考:

  原型模式在客户与复杂对象的创建之间添加了一个中间层(原型克隆)。

6. Prototype 思考:

  Prototype 模式通过复制原型(Prototype)而获得新对象创建的功能,这里 Prototype 本身就是“对象工厂”(因为能够生产对象),实际上 Prototype 模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder 模式重在复杂对象的一步步创建(并不直接返回对象), AbstractFactory 模式重在产生多个相互依赖的对象,而 Prototype 模式重在从自身复制自己创建新类。

7. 代码实现:

  1. 编写一个类 Prototype,类中包含一个克隆函数 Clone()
  2. 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;
}