设计模式-原型模式

原型模式

原型模式使用场景

当在我们的系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源(主要是构造函数的执行),用原型模式生成对象就很高效,直接内存式的拷贝。

原型模式实现要点

  • 用一个已经创建的实例对象作为原型
  • 通过复制该原型对象来创建一个和原型对象相同或者相似的新对象

原型对象的实现方式

原型模式的结构

  1. 抽象原型类:规定了具体原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的clone()方法来复制新的对象。
cpp 复制代码
#include <cstdio>
#include <iostream>

using namespace std;


class Prototype {
protected:
    string prototype_name_;
    float prototype_field_;

public:
    Prototype() {}
    Prototype(string prototype_name)
        : prototype_name_(prototype_name) {
    }
    virtual ~Prototype() {}

    virtual Prototype* Clone() const = 0;

    virtual void Method(float prototype_field) {
        this->prototype_field_ = prototype_field;
        std::cout << "Call Method from " << prototype_name_ << " with field : " << prototype_field << std::endl;
    }
};

class Realizetype1 : public Prototype {
private:
    float realize_prototype_field1_;

public:
    Realizetype1(string prototype_name, float concrete_prototype_field)
        : Prototype(prototype_name), realize_prototype_field1_(concrete_prototype_field) {
    }

    /**
     * 注意,Clone 方法返回一个新的克隆对象的指针,调用者必须释放其内存。
     */
    Prototype* Clone() const override {
        return new Realizetype1(*this); //浅拷贝
    }
};


class Realizetype2 : public Prototype {
private:
    float realize_field2_;

public:
    Realizetype2(string prototype_name, float concrete_prototype_field)
        : Prototype(prototype_name), realize_field2_(concrete_prototype_field) {
    }
    Prototype* Clone() const override {
        return new Realizetype2(*this);
    }
};



int main()
{
    Realizetype1  sxz("孙悟空", 1000);
    Realizetype2  zbj("猪八戒", 800);

    Realizetype1* s1 = (Realizetype1*)sxz.Clone();
    Realizetype2* z2 = (Realizetype2*)zbj.Clone();

    s1->Method(1000);
    z2->Method(800);

    return 0;
}

原型模式的实现优点

  • 创建对象基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。

  • 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。

原型模式的实现的缺点

  • 需要为每一个类都配置一个 clone 方法

  • clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码。

  • 当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。

相关推荐
我爱cope17 小时前
【Agent智能体26 | 多智能体-多智能体工作流】
人工智能·设计模式·语言模型·职场和发展
咖啡八杯1 天前
【无标题】
java·后端·设计模式
折哥的程序人生 · 物流技术专研1 天前
Java 23 种设计模式:从踩坑到精通 | 适配器模式 —— 让不兼容的接口也能一起工作
java·设计模式·面试·适配器模式·单一职责原则
布朗克1681 天前
33 设计模式精讲
java·单例模式·设计模式
sunny.day1 天前
js原型与原型链
开发语言·javascript·原型模式·js原型链
geovindu1 天前
python: Generators Pattern
开发语言·python·设计模式·生成器模式
雨浓YN1 天前
基于设计模式的Winform软件框架-01Xml\Log\Ini日志(单例模式+生产者消费者模式)
单例模式·设计模式
艾利克斯冰2 天前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式
UXbot2 天前
AI网页开发工具能替代工具吗?5大平台对比
前端·人工智能·低代码·ui·原型模式·web app
星心源七境2 天前
七境体系全解析:从六韬兵法到AI锁颜,一套贯穿古典智慧与现代应用的成长操作系统
人工智能·设计模式·设计