• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++设计模式之原型模式

C++设计模式之原型模式

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++设计模式,c++设计模式pdf,c++设计模式视频教程,c++设计模式视频,c++设计模式面试题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

什么是原型模式?

在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。

举一个最简单的例子来说明原型模式:记得上小学的时候,老师把需要做的课外习题写到黑板上,而下面的我们都要把这些题抄写到自己的本子上,回家做好,第二天交上来,也就是每道题,全班50个人,每个人都要抄写一遍。按照现在的时间理论来说,就是浪费了50个人的时间。但是,那个时候条件限制,老师也是不得已而为之。现在好了,老师做一份电子版的习题,打印一份,然后拿着这份打印的原版,就可以复制出50份。

结合原型模式的概念进行分析,老师打印出来的那一份,就是“原型”,而复制出来的那50份,就是使用的“拷贝”。而原型模式就是这么简单的一个道理,通过现有的东西,再复制出一个来。

为什么要使用原型模式?

原型模式和建造者模式、工厂方法模式一样,都属于创建型模式的一种。简单的来说,我们使用原型模式,就是为了创建对象。但是,在以下场景下,使用原型模式是最好的选择:

1.当我们的对象类型不是开始就能确定的,而这个类型是在运行期确定的话,那么我们通过这个类型的对象克隆出一个新的对象比较容易一些;

2.有的时候,我们需要一个对象在某个状态下的副本,此时,我们使用原型模式是最好的选择;例如:一个对象,经过一段处理之后,其内部的状态发生了变化;这个时候,我们需要一个这个状态的副本,如果直接new一个新的对象的话,但是它的状态是不对的,此时,可以使用原型模式,将原来的对象拷贝一个出来,这个对象就和之前的对象是完全一致的了;

3.当我们处理一些比较简单的对象时,并且对象之间的区别很小,可能就几个属性不同而已,那么就可以使用原型模式来完成,省去了创建对象时的麻烦了;

4.有的时候,创建对象时,构造函数的参数很多,而自己又不完全的知道每个参数的意义,就可以使用原型模式来创建一个新的对象,不必去理会创建的过程,让创建过程见鬼去吧。
所以,在上述的的情况下,在设计的时候,适当的考虑一下原型模式,减少对应的工作量,减少程序的复杂度,提高效率。

用UML类图表示原型模式

由于克隆需要一个原型,而上面的类图中Prototype就这个原型,Prototype定义了克隆自身的Clone接口,由派生类进行实现,而实现原型模式的重点就在于这个Clone接口的实现。ConcretePrototype1类和ConcretePrototype2类继承自Prototype类,并实现Clone接口,实现克隆自身的操作;同时,在ConcretePrototype1类和ConcretePrototype2类中需要重写默认的复制构造函数,供Clone函数调用,Clone就是通过在内部调用重写的复制构造函数实现的。在后续的编码过程中,如果某个类需要实现Clone功能,就只需要继承Prototype类,然后重写自己的默认复制构造函数就好了。好比在C#中就提供了ICloneable接口,当某个类需要实现原型模式时,只需要实现这个接口的道理是一样的。

代码实现

/*
** FileName     : PrototypePatternDemo
** Author       : Jelly Young
** Date         : 2013/11/25
** Description  : More information, please go to http://www.weikejianghu.com
*/
 
#include <iostream>
using namespace std;
 
//接口
class Prototype
{
public :
    Prototype(){}
    virtual ~Prototype(){}
 
    virtual Prototype * Clone() = 0;
};
 
//实现
class ConcretePrototype : public Prototype
{
public :
    ConcretePrototype():m_counter(0){}
    virtual ~ConcretePrototype(){}
 
    //拷贝构造函数
    ConcretePrototype( const ConcretePrototype & rhs)
    {
        m_counter = rhs .m_counter;
    }
 
    //复制自身
    virtual ConcretePrototype * Clone()
    {
        //调用拷贝构造函数
        return new ConcretePrototype (*this );
    }
 
private :
    int m_counter;
};
 
int main(int argc , char **argv)
{
    //生成对像
    ConcretePrototype * conProA = new ConcretePrototype ();
 
    //复制自身
    ConcretePrototype * conProB = conProA->Clone();
 
    delete conProA;
    conProA= NULL ;
 
    delete conProB;
    conProB= NULL ;
 
    return 0;
}
</div>

上述代码实现了一个最简单的原型模式,但是已经将原型模式的基本实现原理展现出来了。而有的时候,当调用Clone获得了一个复制的对象以后,需要改变对象的状态,此时就可能需要在ConcretePrototype类中添加一个Initialize操作,专门用于初始化克隆对象。由于在Clone的内部调用的是复制构造函数,而此处又涉及到深复制和浅复制的问题。所以,在实际操作的过程中,这些问题,都需要进行仔细的考虑。

与其它创建型模式的比较

工厂方法模式、抽象工厂模式、建造者模式和原型模式都是创建型模式。工厂方法模式适用于生产较复杂,一个工厂生产单一的一种产品的时候;抽象工厂模式适用于一个工厂生产多个相互依赖的产品;建造者模式着重于复杂对象的一步一步创建,组装产品的过程,并在创建的过程中,可以控制每一个简单对象的创建;原型模式则更强调的是从自身复制自己,创建要给和自己一模一样的对象。

总结

原型模式作为创建型模式中最特殊的一个模式,具体的创建过程,是由对象本身提供,这样我们在很多的场景下可以很方便的快速的构建新的对象。但是,原型模式的最大缺点是继承原型的子类都要实现Clone操作,这个是很困难的。例如,当所考虑的类已经存在时就难以新增Clone操作。当内部包括一些不支持拷贝或者有循环引用的对象时,实现克隆可能也会很困难。说以说,每一种设计模式都有它的优点和缺点,在设计的时候,我们需要进行权衡各方面的因素,扬长避短。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解C++之策略模式
  • C++设计模式之工厂模式
  • C++设计模式编程中简单工厂与工厂方法模式的实例对比
  • 详解C++设计模式编程中对访问者模式的运用
  • 深入解析C++设计模式编程中解释器模式的运用
  • C++设计模式编程之Flyweight享元模式结构详解
  • 详解C++设计模式编程中责任链模式的应用
  • C++设计模式编程中使用Bridge桥接模式的完全攻略
  • C++设计模式编程中的迭代器模式应用解析
  • 深入剖析设计模式中的组合模式应用及在C++中的实现

相关文章

  • 2017-05-28探讨C++中不能声明为虚函数的有哪些函数
  • 2017-05-28C语言矩阵连乘 (动态规划)详解
  • 2017-05-28C语言中while与do-while的介绍与注意事项
  • 2017-05-28详解C语言编程中的函数指针以及函数回调
  • 2017-05-28C++设计模式之中介者模式
  • 2017-05-28c++面试题字符串拷贝函数示例
  • 2017-05-28C语言 解决不用+、-、×、÷数字运算符做加法的实现方法
  • 2017-05-28C/C++ 读取16进制文件的方法
  • 2017-05-28C++智能指针实例详解
  • 2017-05-28C++利用stringstream进行数据类型转换实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言 变量详解及示例代码
    • 数据结构 最小生成树
    • c异或运算 c异或运算符号
    • 详解C++中实现继承string类的MyString类的步骤
    • 浅析C++中cout的运行机制
    • C++ 算法之希尔排序详解及实例
    • C++设计模式之工厂方法模式
    • C++概念重载、覆盖、隐藏的使用说明
    • c++中struct使用注意事项
    • C语言基础知识变量的作用域和存储方式详细介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有