Expert Advisors • Indicators • Scripts • Libraries

MQL.RobotFX.org is the biggest collection of MetaTrader expert advisors (MT5 & MT4), indicators, scripts and libraries that can be used to improve trading results, minimize risks or simply automate trading tasks

MetaTrader 5 Script | Programming Patters - Builder (classic)

MetaTrader Experts, Indicators, Scripts and Libraries

MetaTrader Experts, Indicators, Scripts and Libraries

/*********************************************************************                                                             MQL5 Script                                                  Copyright 2019, dmipec                                                        792112@gmail.com    Classic Builder Programming Pattern     This pattern was published in the "Design Patterns: Elements of     Reusable Object-Oriented Software", 1st Edition, by Erich Gamma     (Author), Richard Helm (Author), Ralph Johnson (Author), John     Vlissides (Author), Grady Booch (Foreword). These authors are     collectively known as Gang of Four (GoF).    Structure is shown on the diagram    Intent     Separate the construction of a complex object from its     representation so that the same construction process can create     different representations.    Applicability   * the algorithm for creating a complex object should be independent     of the parts that make up the object and how they're assembled.   * the construction process must allow different representations for     the object that's constructed.    Participants     Builder      * specifies an interface for creating parts of a Product object.     Concrete Builder      * constructs and assembles parts of the product by implementing        the Builder interface.      * defines and keeps track of the representation it creates.      * provides an interface for retrieving the product.     Director      * constructs an object using the Builder interface;     Product      * represents the complex object under construction. Concrete        Builder builds the product's internal representation and defines        the process by which it's assembled.      * includes classes that define the constituent parts, including        interfaces for assembling the parts into the final result.    Collaborations (see diagram)   * The client creates the Director object and configures it with the     desired Builder object.     Director notifies the builder whenever a part of the product should     be built.   * Builder handles requests from the director and adds parts to the     product.   * The client retrieves the product from the builder.    Consequences     It lets you vary a product's internal representation.        The Builder object provides the director with an abstract        interface for constructing the product. The interface lets the        builder hide the representation and internal structure of the        product. It also hides how the product gets assembled. Because        the product is constructed through an abstract interface, all        you have to do to change the product's internal representation        is define a new kind of builder.     It isolates code for construction and representation.        The Builder pattern improves modularity by encapsulating the way        a complex object is constructed and represented. Clients needn't        know anything about the classes that define the product's        internal structure; such classes don't appear in Builder's        interface. Each Builder contains all the code to create and        assemble a particular kind of product. The code is written once;        then different Directors can reuse it to build Product variants        from the same set of parts.     It gives you finer control over the construction process.        Unlike creational patterns that construct products in one shot,        the Builder pattern constructs the product step by step under        the director's control. Only when the product is finished does        the director retrieve it from the builder. Hence the Builder        interface reflects the process of constructing the product more        than other creational patterns. This gives you finer control        over the construction process and consequently the internal        structure of the resulting product.    Implementation   * Typically there's an abstract Builder class that defines an     operation for each component that a director may ask it to create.     The operations do nothing by default. A ConcreteBuilder class     overrides operations for components it's interested in creating.   * Here are other implementation issues to consider:        Assembly and construction interface.           Builders construct their products in step-by-step fashion.           Therefore the Builder class interface must be general enough           to allow the construction of products for all kinds of           concrete builders. A key design issue concerns the model for           the construction and assembly process. A model where the           results of construction requests are simply appended to the           product is usually sufficient. But sometimes you might need           access to parts of the product constructed earlier. In that           case, the builder would return child nodes to the director,           which then would pass them back to the builder to build the           parent nodes.        Why no abstract class for products?           In the common case, the products produced by the concrete           builders differ so greatly in their representation that there           is little to gain from giving different products a common           parent class. Because the client usually configures the           director with the proper concrete builder, the client is in           a position to know which concrete subclass of Builder is in           use and can handle its products accordingly.        Empty methods as default in Builder.           In C++, the build methods are intentionally not declared pure           virtual member functions. They're defined as empty methods           instead, letting clients override only the operations they're           interested in.    Code output     Construction in progress...        Part A built        Part B built        Part C built     Delivering finished 'Real Product'     This 'Real Product' is made of:        Part A        Part B        Part C   */  
26799