if设计奖官网,企业seo网络营销,华夏名网网站管理助手,免费背景图片素材网站1、定义与动机 定义#xff1a;使用原型实例指定创建对象的种类#xff0c;然后通过拷贝这些原型来创建新的对象。 动机#xff1a; 在软件系统中#xff0c;经常面临着“某些结构复杂的对象”的创建工作#xff1b;由于需求的变化#xff0c;这些对象经常面临着剧烈的变…1、定义与动机 定义使用原型实例指定创建对象的种类然后通过拷贝这些原型来创建新的对象。 动机 在软件系统中经常面临着“某些结构复杂的对象”的创建工作由于需求的变化这些对象经常面临着剧烈的变化但是它们却拥有比较稳定一直的接口如何应对这种变化如何向“客户程序使用这些对象的程序”隔离处“这些易变对象”从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变 个人理解当一个类对象创建复杂、或者需要当前状态且当前状态这个对象又不允许被破坏的情况下为了重复利用就可以考虑使用原型模式来clone一个对象。
2、原型模式
将工厂模式可以改装成一个原型模式通过调用clone方法创建一个新的对象。原型模式的核心是深拷贝的拷贝构造然后再过新创建的对象来执行指定的工作
class ISplitter{
public:virtual void split() 0;virtual ISplitter* clone() 0;virtual ~ISplitter(){}
};
class VideoSplitter: ISplitter{
private:int* value;
public:VideoSplitter(){}virtual void split() override{// ...}virtual ISplitter* clone() override{return new VideoSplitter(*this);}VideoSplitter(const VideoSplitter v){// 深拷贝构造函数// ....this-value new int(*(v.value));// ....}~VideoSplitter(){delete value;value nullptr;}
};
class FileSplitter: public ISplitter{
private:int* value;
public:virtual void split() override{// ...}virtual ISplitter* clone() override{return new FileSplitter(*this);}
};
class MainForm: public Form{
private:ISplitter *prototype;
public:MainForm(ISplitter *iSplitter): prototype(iSplitter){}void button_event(){ISplitter* splitter prototype-clone();splitter-split(...);delete splitter;splitter nullptr;}
};void process()
{MainForm* mainForm new MainForm(new FileSplitter());mainForm-button_event();
}3、总结
Prototype模式同样用于隔离类对象的使用者和具体类型易变类之间的耦合关系它同样要求这些“易变类”拥有“稳定的接口”。Prototype模式用于“如何创建易变类的实体对象”采用“原型克隆的方法来做”它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个心累的对象即原型然后再任何需要的地方Clone。Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝例如Java语言C中一般采用拷贝构造函数进行深拷贝。