欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

设计模式 - 工厂方法 - MetaTrader 5 库

author emer | 313 人阅读 | 0 人评论 |
//FACTORY METHOD -------------------------------------------------------------------------------
// |团体
// |  |创造的
// |意图
// |  |用于创建对象的接口
// |  |  |将实例化推迟到子类
// |  |子类决定实例化哪个类
// |好处
// |  |代码的各个方面可能有所不同
// |  |  |实例化对象的子类
// |  |重构
// |  |  |问题
// |  |  |  |通过显式指定类来创建对象
// |  |  |解决方案
// |  |  |  |间接创建对象
// |  |  |  |  |还
// |  |  |  |  |  |抽象工厂
// |  |  |  |  |  |原型
// |适用性
// |  |一个班级
// |  |  |无法预测它必须创建的对象的类别
// |  |  |希望它的子类指定它创建的对象
// |  |  |将责任委托给几个辅助子类之一
// |  |  |  |本地化哪个辅助子类是委托的知识
// |结构
// |  |
//                                                |         创建者        |
//                                                |------------------------|
//                                                |FactoryMethod()         |
//                                                |AnOperation()           |
//                                                | ...                    |
//                                                |产品=FactoryMethod()|
//                 |Product|                      | ...                    |
//                     ^                                     ^
//                     |                                      |
//             |混凝土产品|<- - - - - - - -|      具体创建器      |
//                                              |----------------------------|
//                                              |FactoryMethod()            |
//                                             |返回新的混凝土产品|
// |  |
#包括名称空间工厂方法
{// |  |
// |参加者 ------------------------------------------------------------------------------------------
// |  |产品
// |  |  |工厂方法创建的对象的接口
// |  |  |
界面产品
  {
  };// |  |  |
// |  |混凝土产品
// |  |  |实现产品接口
// |  |  |
班级具体产品:民众产品
  {民众:
                     具体产品();
  };
混凝土产品::混凝土产品(空白)
  {
  打印“哈希:”,&);
  }// |  |  |
// |  |创造者
// |  |  |声明工厂方法
// |  |  |  |返回 Product 类型的对象
// |  |  |  | default implementation of the factory method
// |  |  |  |  |返回默认的 ConcreteProduct 对象
// |  |  |可以调用工厂方法来创建Product对象
// |  |  |
班级创作者
  {民众:
  虚拟的产品*  FactoryMethod()=0;
  空白              一个操作();
                    〜创建者();受保护的:
   产品*          产品;
  };
创建者::~创建者(空白)
  {
  删除产品;
  }空白 Creator::AnOperation(空白)
  {
  删除产品;
  打印“创造者操作:用虚拟工厂的方式创造产品。”);
   产品=FactoryMethod();
  }// |  |  |
// |  |具体创造者
// |  |  |重写工厂方法
// |  |  |返回 ConcreteProduct 的实例
// |  |  |
班级具体创建者:民众创作者
  {民众:
   产品*          FactoryMethod();
  };
产品* ConcreteCreator::FactoryMethod(空白)
  {
  打印《具体创建者工厂方法:返回新产品》);
  返回 新的混凝土产品;
  }// |  |  |
// |  |客户
// |  |  |
班级客户:民众客户端示例
  {民众:
  细绳            输出();
  空白              跑步();
  };细绳客户端::输出()
  {
  返回 __功能__;
  }// |  |  
// |合作----------------------------------------------------------------------------------------
// |  |创作者
// |  |  |依赖于它的子类
// |  |  |  |定义工厂方法
// |  |  |  |  |返回相应 ConcreteProduct 的实例
// |  |  
空白客户端::运行()
  {
   ConcreteCreator创建者;
   产品* 产品=creator.FactoryMethod();
   创建者.AnOperation();//---  删除产品;
  }
}// |  |
// |输出  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// |  |创建::工厂方法::客户端::输出
// |  |具体创建者工厂方法:返回新产品
// |  |哈希值:138412032
// |  |创建者操作:用虚拟工厂方式创建产品。
// |  |具体创建者工厂方法:返回新产品
// |  |哈希值:139460608
// |  |
// |结果  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// |  |代码仅处理 Product 接口
// |  |  |可以与任何用户定义的 ConcreteProduct 类一起使用
// |  |  |但客户可能必须对 Creator 类进行子类化
// |  |  |  |创建特定的 ConcreteProduct 对象
// |  |为子类提供钩子
// |  |  |在类中创建对象是
// |  |  |  |比直接创建对象更灵活
// |  |  |工厂方法是
// |  |  |  |不抽象
// |  |  |  |提供合理的默认实现
// |  |连接并行类层次结构时
// |  |  |类将其一些职责委托给单独的类
// |  |  |考虑图形数字
// |  |  |  |可以交互操作
// |  |  |  |  |操纵对象
// |  |  |  |  |  |实现交互
// |  |  |  |  |  |跟踪所需的任何特定于操作的状态
// |  |  |  |  |人物类
// |  |  |  |  |  |提供工厂方法
// |  |  |  |  |  |  |让客户创建相应的操纵器
// |  |  |  |  |图形子类
// |  |  |  |  |  |覆盖此方法以返回
// |  |  |  |  |  |  |适合他们的操纵器子类的实例
// |执行  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// |  |创作者
// |  |  |抽象的
// |  |  |具体的
// |  |  |  |工厂方法的默认实现
// |  |  |  |对象的类别
// |  |  |  |  |父实例化
// |  |  |  |  |可以改变
// |  |参数化工厂方法
// |  |  |新种类产品的新标识符
// |  |  |将现有标识符与不同的产品相关联
// |  |特定于语言的变体和问题
// |  |  | C++ 中的工厂方法
// |  |  |  |总是虚函数
// |  |  |  |通常是纯虚拟的
// |  |  |  |使用延迟初始化
// |  |  |  |  |创建者的构造函数不调用工厂方法
// |  |使用模板来避免子类化
// |  |  |创建者的模板子类
// |  |  |  |由产品类别参数化
// |  |命名约定
// |  |  |明确工厂方法的使用
//--------------------------------------------------------------------------------------------------------



附件下载

📎 pattern.mq5 (0.35 KB)

📎 patterns.mqh (2.91 KB)

📎 factorymethod.mqh (7.03 KB)

Source: MQL5 #30371

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录