本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。