新版MQL语言程序设计:原型模式的原理、应用及代码实现

文章目录

一、什么是原型模式

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过实例化类来创建

二、为什么需要原型模式

  1. 提高性能:通过复制现有对象来创建新对象,避免了重复创建对象的开销,从而提高了性能。
  2. 简化对象的创建过程:使用原型模式可以通过复制一个已有对象来创建新对象,从而简化了对象的创建过程。
  3. 保护对象的状态:使用原型模式可以通过复制原型对象来创建新对象,从而保护了原型对象的状态。
  4. 提供灵活性:原型模式允许在运行时动态地添加或删除对象,从而提供了更大的灵活性。
  5. 促进代码复用:通过复制现有对象来创建新对象,可以避免重复编写相似的代码,从而促进了代码的复用。

三、原型模式实现方法

  1. 在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法,用于复制对象。
  2. 然后,我们创建一个具体的原型类,该类实现了原型接口,并实现了克隆方法来复制自身。
  3. 使用原型模式可以避免直接实例化类,从而提高对象的创建效率。当需要创建大量相似对象时,原型模式非常有用。通过复制现有对象,我们可以快速创建新对象,并根据需要进行修改。
  4. 在原型模式中,对象的复制可以分为浅复制和深复制两种方式。浅复制只复制对象的基本属性,而深复制会递归复制对象的所有属性,包括引用类型的属性。

四、原型模式的应用范围及例子

  1. 创建对象的成本较高:当创建一个对象的成本较高时,可以使用原型模式来复制一个已有对象,从而避免重复创建对象的开销。

  2. 避免构造函数的复杂性:有时候,一个对象的构造函数可能非常复杂,包含了大量的初始化逻辑。使用原型模式可以避免这种复杂性,通过复制一个已有对象来创建新对象。

  3. 保护对象的状态:有些对象的状态可能会发生变化,但是在某些情况下,我们希望保留对象的初始状态。使用原型模式可以通过复制原型对象来创建新对象,从而保护原型对象的状态。

  4. 简化对象的创建过程:有时候,创建一个对象可能涉及到多个步骤,而且这些步骤可能会有不同的变体。使用原型模式可以通过复制一个已有对象来创建新对象,从而简化对象的创建过程。

  5. 例子说明:当你创建一个原型艺术品,它是你的初始设计。然后,你可以使用原型模式来复制这个原型,并对每个副本进行微调以创建不同的艺术品。汽车制造商可以使用原型模式来创建不同型号的汽车,而无需重新设计每个型号。他们可以基于一个原型汽车进行复制,并对每个副本进行微调,例如改变外观、内饰或功能。

五、原型模式的代码实现

cpp 复制代码
class Prototype
{
    public:
        virtual Prototype* Clone(void)=0;
        Prototype(int);
    protected:
        int               id;
};
Prototype::Prototype(int i):id(i)
{
    Print("The prototype ",&this,", id - ",id," is created");
}
class ConcretePrototype1:public Prototype
{
    public:
        ConcretePrototype1(int);
        Prototype*        Clone(void);
};
ConcretePrototype1::ConcretePrototype1(int i):
    Prototype(i)
{
    Print("The concrete prototype 1 - ",&this,", id - ",id," is created");
}
Prototype* ConcretePrototype1::Clone(void)
{
    Print("The cloning concrete prototype 1 - ",&this,", id - ",id);
    return new ConcretePrototype1(id);
}
class ConcretePrototype2:public Prototype
{
    public:
        ConcretePrototype2(int);
        Prototype*        Clone(void);
};
ConcretePrototype2::ConcretePrototype2(int i):
    Prototype(i)
{
    Print("The concrete prototype 2 - ",&this,", id - ",id," is created");
}
Prototype* ConcretePrototype2::Clone(void)
{
    Print("The cloning concrete prototype 2 - ",&this,", id - ",id);
    return new ConcretePrototype2(id);
}
class Client
{
    public:
        string            Output(void);
        void              Run(void);
};
string Client::Output(void) {return __FUNCTION__;}
void Client::Run(void)
{
    Prototype* prototype;
    Prototype* clone;
    Print("requests to create the concrete prototype 1 with id 1");
    prototype=new ConcretePrototype1(1);
    Print("requests the prototype ",prototype," to create its clone");
    clone=prototype.Clone();
    delete prototype;
    delete clone;
    Print("requests to create the concrete prototype 2 with id 2");
    prototype=new ConcretePrototype2(2);
    Print("requests the prototype ",prototype," to create its clone");
    clone=prototype.Clone();
    delete prototype;
    delete clone;
}
相关推荐
彤银浦5 分钟前
python学习记录7
python·学习
这可就有点麻烦了5 分钟前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
少女忧6 分钟前
51单片机学习第六课---B站UP主江协科技
科技·学习·51单片机
落落落sss8 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
简单.is.good26 分钟前
【测试】接口测试与接口自动化
开发语言·python
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
我是陈泽1 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
优雅的小武先生1 小时前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
邓校长的编程课堂1 小时前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法