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

来源:互联网 发布:php 协程 异步 编辑:程序博客网 时间:2024/05/29 03:22

目录:

设计模式学习笔记首页
设计模式(1)——抽象工厂 AbstractFactory
设计模式(2)——生成器 Builder
设计模式(3)——工厂方法 Factory Method
设计模式(4)——原型 Prototype
设计模式(5)——单例 Singleton
设计模式(6)——适配器 Adapter
设计模式(7)——桥接 Bridge
设计模式(8)——组合 Composite
设计模式(9)——装饰 Decorator
设计模式(10)——外观 Facade
设计模式(11)——享元 Flyweight
设计模式(12)——代理 Proxy
设计模式(13)——职责链 Chain Of Responsibility
设计模式(14)——命令 Command
设计模式(15)——解释器 Interpreter
设计模式(16)——迭代器 Iterator
设计模式(17)——中介者 Mediator
设计模式(18)——备忘录 Memento
设计模式(19)——观察者 Observer
设计模式(20)——状态 State
设计模式(21)——策略 Strategy
设计模式(22)——模板方法 Template Method
设计模式(23)——访问者 Visitor

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

1. 问题:

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

2. 意图:

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

3. 适用:

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

4. 类图:

image

5. 中间层思考:

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

6. Prototype 思考:

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

7. 代码实现:

  1. 编写一个类 Prototype,类中包含一个克隆函数 Clone()
  2. Clone 方法内生成一个深拷贝自身 this 的对象返回

Prototype.h

// Prototype.h#pragma onceclass 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;}
原创粉丝点击