c++设计模式原则,C++的设计模式

c++设计模式原则,C++的设计模式,C++设计模式之原型模式

本文主要介绍C设计模式的原型模式。本文解释了什么是原型模式,为什么应该使用原型模式,代码示例等等。有需要的可以参考一下。

什么是原型模式?

在GOF的《设计模式:可复用面向对象软件的基础》中,据说原型实例用于指定所创建对象的种类,并且通过复制这些原型来创建新对象。在这个定义中,最重要的一个词是“复制”,即口头复制,而这个复制就是原型图案的本质。

举个最简单的例子来说明原型模型:我记得我上小学的时候,老师把需要做的课外练习写在黑板上,而下面的题抄在我们自己的书上,我们回家做好,第二天交上来,就是每道题全班50个人写,每个人都要抄一遍。按照现在的时间理论,就是浪费50个人的时间。不过当时条件有限,老师也没办法,只能这么做。现在老师可以做电子版的练习,打印一份,然后拿打印好的原件做50份。

根据原型模式的概念,老师打印出来的是“原型”,而50份是使用的“副本”。而原型图案就是这么简单的道理,通过已有的东西,然后复制一个。

为什么要使用原型模式?

原型模式与构建器模式和工厂方法模式一样,是一种创新模式。简单地说,我们使用原型模式来创建对象。但是,在下列情况下,使用原型模式是最佳选择:

1.当我们的对象类型在开始时无法确定,但在运行时确定了这个类型,我们就更容易通过这个类型的对象克隆一个新的对象;

2.有时候,我们需要一个处于某种状态的对象的副本。这个时候,使用原型模式是我们最好的选择;比如一个物体经过一段时间的处理,内部状态发生了变化;这时候我们需要这个状态的副本,如果我们直接创建一个新的对象,但是它的状态是错误的。这时候我们可以用原型模式来复制原对象,这个对象和上一个对象完全一致。

3.当我们处理一些相对简单的对象,并且对象之间的差异很小,可能只有少数属性不同,那么就可以用原型模式来完成,省去了创建对象的麻烦;

4.有时候在创建一个对象的时候,构造函数的参数很多,你并不完全知道每个参数的含义,那么你可以使用prototype模式来创建一个新的对象。你不必关注创造过程,让创造过程见鬼去吧。

因此,在上述情况下,设计时应适当考虑原型模式,减少相应的工作量,降低程序的复杂度,提高效率。

用UML类图表示原型模式

因为克隆需要一个原型,而上面类图中的原型就是原型,原型定义了克隆本身的克隆接口,由派生类实现,实现原型模式的关键点就在于这个克隆接口的实现。ConcretePrototype1和ConcretePrototype2从Prototype继承而来,实现了克隆接口来克隆自己。同时需要在ConcretePrototype1和ConcretePrototype2类中重写默认的复制构造函数供克隆函数调用,通过内部调用重写的复制构造函数实现克隆。在后续的编码过程中,如果一个类需要实现克隆功能,只需要继承原型类,然后重写其默认的复制构造函数即可。比如C#中提供了ICloneable接口。当一个类需要实现原型模式时,出于同样的原因,它只需要实现这个接口。

代码实现

复制代码如下:

/*

**文件名:PrototypePatternDemo

**作者:杰利扬

**日期:2013年11月25日

**描述:更多信息,请到https://www.jb51.net

*/

#包括iostream

使用命名空间std

//接口

类原型

{

公共:

原型(){}

虚拟~原型(){}

虚拟原型*克隆()=0;

};

//实现

类混凝土原型:公共原型

{

公共:

concrete prototype():m _ counter(0){ }

virtual ~ConcretePrototype(){}

//复制构造函数

混凝土原型(const混凝土原型rhs)

{

m_counter=rhs。m _ counter

}

//复制自身

虚拟混凝土原型*克隆()

{

//调用复制构造函数

返回新的concrete prototype(* this);

}

私人:

int m _ counter

};

int main(int argc,char **argv)

{

//生成一个对象

concrete prototype * con proa=new concrete prototype();

//复制自身

concrete prototype * con prob=con proa-Clone();

删除conProA

conProA=NULL

删除conProB

conProB=NULL

返回0;

}

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

与其它创建型模式的比较

工厂模式、抽象工厂模式、建造者模式和原型模式都是创造性模式。工厂模式适用于复杂的生产,当一个工厂生产单一产品时;抽象工厂适用于一个工厂生产多个相互依赖的产品;Builder模式专注于一步一步创建复杂对象并组装产品的过程,在创建的过程中,你可以控制每个简单对象的创建;原型模式更强调从自己身上复制自己,创造出和自己一模一样的物体。

总结

作为创建模式中最特殊的模式,原型模式是由对象本身提供的,这样我们就可以在很多场景中方便快捷地创建新的对象。但是原型模式最大的缺点是所有继承原型的子类都要实现克隆操作,难度很大。例如,当考虑中的类已经存在时,很难添加克隆操作。当有些对象不支持复制或具有循环引用时,克隆也可能很困难。换句话说,每种设计模式都有其优点和缺点。设计的时候需要权衡各种因素,做到扬长避短。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: