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 ConcretePrototype1
class ConcretePrototype1 : public Prototype
{
public:ConcretePrototype1(string strName) : Prototype(strName) {}ConcretePrototype1() {}virtual Prototype* Clone(){ConcretePrototype1* p = new ConcretePrototype1();*p = *this;//复制对象return p;}
};//class ConcretePrototype2
class 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、《设计模式----可复用面向对象软件的基础》

设计模式之原型模式(Prototype)摘录相关推荐

  1. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  2. 设计模式之原型模式prototype

    1.原型模式的使用和本质.以及优势: a.通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式. b.原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新 ...

  3. 【设计模式】—— 原型模式Prototype

    前言:[模式总览]----------by xingoo 模式意图 由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了.通过原型模式就可以通过拷贝函数clone一个原有的 ...

  4. java prototype是什么,java设计模式-原型模式(Prototype)

    定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...

  5. 温故而知新:设计模式之原型模式(Prototype)

    原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本.(通常是深拷贝的副本) 深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例.(当然如果浅拷贝的话 ...

  6. 设计模式五: 原型模式(Prototype)

    简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本 ...

  7. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  8. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  9. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

最新文章

  1. 研究生论文盲审、查重再加码!毕业或将变的更加困难...
  2. .NET版本与CLR版本及兼容性
  3. 用ASP自动生成SQL数据库的安装源程序
  4. 软件项目管理0706:工匠精神
  5. Spark资源分配异常闪Bug
  6. 已经windows如何在安装linux,如何在已经安装linux情况下安装windows
  7. 先进的NumPy数据科学
  8. Spring Boot自动化配置的利弊及解决之道
  9. MySQL的初识(python开发者的第一印象)
  10. (98)FPGA边沿检测(下降沿检测)
  11. libjpeg-turbo在Windows VS2010下的编译
  12. 【Statistics】均值
  13. 服务 23 年,苹果宣布停止 macOS Server
  14. 4个开源 TCP/IP 栈被曝33个漏洞,数百万智能和工业设备受影响
  15. 【渝粤教育】国家开放大学2018年秋季 0700-22T中级会计实务(一) 参考试题
  16. MyCat全局序列之本地时间戳方式
  17. 从优秀到卓越 pdf_演讲口才培训:演讲能力是卓越领导者需要具备的能力
  18. 国际云安全证书CCSK让他们在职场中脱颖而出
  19. 联想P340加显卡白屏,降级BIOS恢复正常。
  20. 前馈神经网络初步了解

热门文章

  1. 疑问:undistortPoints()与remap()畸变校正后,结果相差很大
  2. 张正友平面标定法的一些注意事项
  3. 【开源方案共享】无序点云快速的线段分割算法
  4. 剑指offer:面试题13. 机器人的运动范围
  5. Learn OpenGL (十一):光照贴图
  6. Python中的urllib.quote和Go中的url.QueryEscape关系探讨
  7. 在Ubuntu 16.04.3 LTS上安装Go 1.10
  8. Blender与UE5完美结合全流程创作游戏资产视频教程
  9. 搜索引擎Killed原因排查
  10. 数据库1.0 -- 数据库的基本操作