新版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;
}
相关推荐
Swift社区39 分钟前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht40 分钟前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht43 分钟前
Swift闭包的本质
开发语言·ios·swift
wjs20241 小时前
Swift 数组
开发语言
xiaoyalian1 小时前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
Red Red3 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
mqiqe3 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql