预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。Prototype设计模式,就是为了解决如何向“客户程序”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求的改变而改变。 Prototype设计模式指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 要点: Prototype设计模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。 Prototype设计模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象,所需要的工作仅仅是注册一个新类的对象(即原型),然后在需要的地方不断地Clone Clone时要注意使用DeepClone。 深拷贝与浅拷贝区别: 浅拷贝也称位拷贝,就是对象的数据成员之间的简单赋值,例如一个类我们没有具体定义其拷贝构造函数当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝。 如果对象中没有其他的资源(如:堆,文件,系统资源等),则深拷贝和浅拷贝没有什么区别,但是如果有那么浅拷贝只是简单的引用这些资源,而深拷贝是会复制这些资源的。 举例说明: 1classPeople 2{ 3public: 4People(Hair*ha,inta) 5:h(ha),age(a) 6{} 7private: 8Hair*h; 9intage; 10}; 11Hair*ha=newHair(....); 12Peoplep1(ha,a); 13Peoplep2=p1;//浅拷贝p2.h=p1.h,p2.age=p1.age 那么如果是浅拷贝(位拷贝)只是简单的将Hair*h指针指向ha指针指向的资源。那么这里想象下这里如果在销毁p1的时候我们会释放p1.h所指向的资源,那么在使用p2就会发生错误!!所以我们平常应该尽量少使用浅拷贝,这会给程序带来危害。 当然从这里我们也可以得知,如果没有资源,深浅拷贝是没有任何区别的。 下面接着看原型模式: 1classwheel 2{ 3public: 4wheel(std::stringn,intl) 5:name(n),loadCapacity(l) 6{} 7wheel() 8:name(""),loadCapacity(0) 9{} 10voidshow(); 11wheel*Clone(); 12private: 13std::stringname; 14intloadCapacity; 15}; 16voidwheel::show() 17{ 18std::cout<<"Thewheelnameis"<<name<<std::endl; 19std::cout<<"ThewheelloadCapacityis"<<loadCapacity<<std::endl; 20} 21 22wheel*wheel::Clone() 23{ 24returnnewwheel(name,loadCapacity); 25} 26 27classCar 28{ 29public: 30Car(std::stringcolor,wheel*w,std::stringengine) 31 32:_color(color),_wheel(w),_engine(engine) 33{} 34virtualCar*Clone()=0; 35virtualvoidShow()=0; 36virtualvoidsetColor(std::stringcolor)=0; 37virtual~Car(){} 38protected: 39std::string_color; 40//有一个资源 41wheel*_wheel; 42std::string_engine; 43}; 44 45classBenzCar:publicCar 46{ 47public: 48BenzCar(std::stringcolor,wheel*w,std::stringengine) 49:Car(color,w,engine) 50{} 51~BenzCar(); 52voidShow(); 53Car*Clone(); 54voidsetColor(std::stringcolor); 55}; 56 57BenzCar::~BenzCar() 58{ 59delete_wheel; 60} 61Car*BenzCar::Clone() 62{ 63wheel*l=_wheel.Clone(); 64Car*pc=newBenzCar(_color,l,_engi