设计模式之原型模式(Prototype)摘录

来源:互联网 发布:131458淘宝信用查询 编辑:程序博客网 时间:2024/04/30 04:09

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。

创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).

结构型模式包括:6、Bridge(桥接模式);7、Adapter(适配器模式);8、Decorator(装饰模式);9、Composite(组合模式);10、Flyweight(享元模式);11、Facade(外观模式);12、Proxy(代理模式).

行为模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(状态模式);16、Observer(观察者模式);17、Memento(备忘录模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(访问者模式);21、Chain of Responsibility(责任链模式);22、Iterator(迭代器模式);23、Interpreter(解释器模式).

Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

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

Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。

Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。

Flyweight:运用共享技术有效地支持大量细粒度的对象。

Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

Proxy:为其他对象提供一个代理以控制对这个对象的访问。

Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

 

         Prototype:(1)、意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;(2)、当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式;以及当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者为了避免创建一个与产品类层次平行的工厂类层次时;或者当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些;(3)、优点:A、运行时刻增加和删除产品:Prototype允许只通过客户注册原型实例就可以将一个新的具体产品类并入系统。它比其他创建型模式更为灵活,因为客户可以在运行时刻建立和删除原型;B、改变值以指定新对象:高度动态的系统允许你通过对象复合定义新的行为,例如,通过为一个对象变量指定值----并且不定义新的类。你通过实例化已有类并且将这些实例注册为客户对象的原型,就可以有效定义新类别的对象。客户可以将职责代理给原型,从而表现出新的行为。这种设计使得用户无需编程即可定义新“类”。实际上,克隆一个原型类似于实例化一个类。Prototype模式可以极大的减少系统所需要的类的数目;C、改变结构以指定新对象;D、减少子类的构造:Factory Method经常产生一个与产品类层次平行的Creator类层次。Prototype模式使得你克隆一个原型而不是请求一个工厂方法去产生一个新的对象。因此你根本不需要Creator类层次。这一优点主要适用于像C++这样不降类作为一级类对象的语言;E、用类动态配置应用:一些运行时刻环境允许你动态将类装载到应用中。在像C++这样的语言中,Prototype模式是利用这种功能的关键。

         一个希望创建动态载入类的实例的应用不能静态引用类的构造器。而应该由运行环境在载入时自动创建每个类的实例,并用原型管理器来注册这个实例。这样应用就可以向原型管理器请求新装载的类的实例,这些类原本并没有和程序相连接。

         Prototype的主要缺陷是每一个Prototype的子类都必须实现Clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增Clone操作。当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很困难的。

         Prototype和Abstract Factory模式在某种方面是相互竞争的。但是它们也可以一起使用。Abstract Factory可以存储一个被克隆的原型的集合,并且返回产品对象。大量使用Composite和Decorator模式的设计通常也可从Prototype模式处获益。

         Prototype模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中将通过拷贝构造函数实现之。

         从一个对象再创建一个可定制的对象,而无需知道任何创建的细节,并能提高创建的性能。说白了就copy技术,把一个对象完整的copy出一份。

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

示例代码1:

#include <iostream>#include <vector>#include <string>using namespace std;class Prototype//抽象基类{private:string m_strName;public:Prototype(string strName) {m_strName = strName;}Prototype() {m_strName = "";}void Show(){cout<<m_strName<<endl;}virtual Prototype* Clone() = 0;};//class ConcretePrototype1class ConcretePrototype1 : public Prototype{public:ConcretePrototype1(string strName) : Prototype(strName) {}ConcretePrototype1() {}virtual Prototype* Clone(){ConcretePrototype1* p = new ConcretePrototype1();*p = *this;//复制对象return p;}};//class ConcretePrototype2class ConcretePrototype2 : public Prototype{public:ConcretePrototype2(string strName) : Prototype(strName) {}ConcretePrototype2() {}virtual Prototype* Clone(){ConcretePrototype2* p = new ConcretePrototype2();*p = *this;//复制对象return p;}};//客户端int main(){ConcretePrototype1* test1 = new ConcretePrototype1("小王");ConcretePrototype2* test2 = (ConcretePrototype2*)test1->Clone();test1->Show();test2->Show();/* result:小王小王*/return 0;}


示例代码2:

prototype.h:

#ifndef _PROTOTYPE_H_#define _PROTOTYPE_H_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:};#endif//_PROTOTYPE_H_

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:

#include "prototype.h"#include <iostream>using namespace std;int main(){Prototype* p = new ConcretePrototype();Prototype* p1 = p->Clone();/* result:ConcretePrototype copy ...*/return 0;}


原型模式结构图:


参考文献:

1、《大话设计模式C++》

2、《设计模式精解----GoF23种设计模式解析》

3、《设计模式----可复用面向对象软件的基础》


0 0
原创粉丝点击