广西建设厅建管处网站wordpress机器爬虫爬资讯

当前位置: 首页 > news >正文

广西建设厅建管处网站,wordpress机器爬虫爬资讯,北京门户网站设计,做自己的网站怎么赚钱一#xff0c;原型模式的定义 原型模式是一种创建型设计模式#xff0c;它允许通过克隆已有对象来创建新对象#xff0c;从而无需调用显式的实例化过程。 原型模式的设计#xff0c;使得它可以创建一个与原型对象相同或类似的新对象#xff0c;同时又可以减少对象实例化…一原型模式的定义 原型模式是一种创建型设计模式它允许通过克隆已有对象来创建新对象从而无需调用显式的实例化过程。 原型模式的设计使得它可以创建一个与原型对象相同或类似的新对象同时又可以减少对象实例化操作产生的性能开销使得创建对象的操作更加便捷它减少了大量不必要的重复工作并提高了系统性能。 当创建对象的操作比较复杂和耗时的时候原型模式则提供了一个更加高效和简单的创建对象的模式它可以更加快速的创建对象的副本且不需要依赖对象的某些实例化步骤它避免了使用传统的new关键字创建对象实例时的复杂构造过程。 原型模式的主要缺点则是原型对象必须预先存在于系统中并且需要预先进行注册。此时如果有大量的原型对象需要被创建并且每个原型对象都需要进行自定义维护和管理这些原型对象可能会变得很复杂。 原型模式在现实生活中的抽象实例 图形绘制假设我们需要绘制不同形状的图形可以定义一个图形类作为原型然后通过克隆该原型对象来创建具体的图形对象。 陶艺制作先制作一个陶艺原型作为参考然后通过复制或克隆原型来制作出多个相似的陶艺品。 服装设计设计师预先设计一套成衣样板然后通过复制或克隆样板来制作出多件相似或不同款式的服装。 二原型模式的结构 原型模式主要包含以下组件 1.抽象原型(Prototype)定义克隆方法的接口具体原型类通过实现这些方法来提供其自身的副本。 2.具体原型(ConcretePrototype)包含抽象原型类的具体实现它会提供一个复制自身的方法该方法将创建并返回一个对象副本。 3.客户端(Client)客户端使用原型类来创建新对象的副本它会先获取原型对象并使用原型对象的克隆方法来创建新的对象实例。 组件之间的工作步骤如下 1.客户端通过实例化具体原型类并调用其克隆方法来创建一个原型对象。 2.原型对象调用自身的克隆方法将自身复制一份返回一个克隆的对象。 3.客户端获取到克隆对象后可以根据自身的业务需求对其进行进一步的修改和使用。 对应UML类图 三原型模式代码样例 Demo1 #include iostream #include string//定义原型基类 class Prototype { public:virtual ~Prototype() {}virtual Prototype* clone() const 0;virtual void print() const 0; };//定义具体原型类 class ConcretePrototype : public Prototype{ private:std::string name; public:ConcretePrototype(const std::string name) : name(name) {}Prototype* clone() const override {return new ConcretePrototype(this);}void print() const override {std::cout Prototype: name std::endl;} };int main() {//创建原型对象ConcretePrototype prototype(Original);//使用原型对象创建新对象Prototype clone prototype.clone();clone-print();//释放内存delete clone;return 0; } 运行结果 Prototype: Original Demo2 #include iostream #include stringclass Prototype { public:virtual ~Prototype() {}virtual Prototype* clone() const 0;virtual void info() const 0; };class ConcretePrototypeA: public Prototype { public:ConcretePrototypeA(int id, std::string name): m_id(id), m_name(name) {}Prototype* clone() const override {return new ConcretePrototypeA(this);}void info() const override {std::cout ConcretePrototypeA: id m_id , name m_name std::endl;} private:int m_id;std::string m_name; };class ConcretePrototypeB: public Prototype { public:ConcretePrototypeB(std::string description): m_description(description) {}Prototype clone() const override {return new ConcretePrototypeB(this);}void info() const override {std::cout ConcretePrototypeB: description m_description std::endl;} private:std::string m_description; };int main() {ConcretePrototypeA prototypeA new ConcretePrototypeA(1, First);Prototype* cloneA prototypeA-clone();cloneA-info();ConcretePrototypeB* prototypeB new ConcretePrototypeB(This is a prototype);Prototype* cloneB prototypeB-clone();cloneB-info();delete prototypeA;delete cloneA;delete prototypeB;delete cloneB;return 0; } 运行结果 ConcretePrototypeA: id 1, name First ConcretePrototypeB: description This is a prototype 四原型模式的应用场景 图形用户界面创建可定制的控件如Windows的对话框设计一个原型控件让用户根据需求选择属性进行定制。 文本编辑器开发支持“剪切”、“复制”、“粘贴”的功能使用已存在的文档作为复制和创建新文档的原型。 数据库开发将数据库的某个状态视为原型当需要创建新的数据库版本时可以直接从这个原型复制。 配置工具开发基于原型模式帮助快速生成配置对象而无需每次都新建一个空的配置。 Web应用程序让用户可以在原型基础上添加、修改字段动态生成表单元素。 五原型模式的优缺点 原型模式的优点 简化了对象的创建过程使得代码更加简洁且易于维护。 提高了动态创建对象和销毁对象的效率。 封装和隐藏了创建对象的细节。 减少了对构造函数的直接调用提高了代码的性能。 支持灵活的定制具体对象的属性和方法。 原型模式的缺点 需要实现克隆对象的接口。 需要配合深拷贝或浅拷贝来使用可能会导致引用对象的复制。 有的原型模式基于递归的方式来克隆对象可能会引起堆栈溢出的问题。 针对大型对象的复制会占用特别多的内存。 六代码实战 Demo1基于智能指针封装的原型模式 #include memory #include iostreamclass Prototype { public:virtual std::unique_ptrPrototype clone() const 0;void printValue() const {std::cout Origin Value. std::endl;} };class ConcretePrototype : public Prototype { private:int value; public:ConcretePrototype(int v) : value(v) {}std::unique_ptrPrototype clone() const override {return std::make_uniqueConcretePrototype(value);}void printValue() const {std::cout Value: value std::endl;} };int main() {auto prototype std::make_uniqueConcretePrototype(5);auto clonedPrototype prototype-clone();prototype-printValue();clonedPrototype-printValue();return 0; } 运行结果 Value: 5 Origin Value. Demo2基于工厂的方式管理各种原型 #include iostream #include string #include mapclass Prototype { public:int data;std::string name;Prototype(int data, const std::string name) : data(data), name(name) {}virtual Prototype* clone() {return new Prototype(this);} };class PrototypeFactory { private:std::mapstd::string, Prototype prototypes; public:PrototypeFactory() {prototypes[original] new Prototype(40, Original);prototypes[copy] new Prototype(100, Copy);}Prototype* create(const std::string type) {return prototypes[type]-clone();} };int main() {PrototypeFactory factory;Prototype* original factory.create(original);Prototype* copy factory.create(copy);std::cout Original: data original-data , name original-name std::endl;std::cout Copy: data copy-data , name copy-name std::endl;delete original;delete copy;return 0; } 运行结果 Original: data40, nameOriginal Copy: data100, nameCopy 七参考阅读 https://softwarepatterns.com/cpp/prototype-software-pattern-cpp-example https://www.geeksforgeeks.org/prototype-design-pattern/ https://www.tutorialspoint.com/design_pattern/prototype_pattern.html https://sourcemaking.com/design_patterns/prototype https://softwareparticles.com/design-patterns-prototype/