Wzór konstruktora - Builder pattern

Wzór budowniczym jest wzorzec projektowy zaprojektowany, aby zapewnić elastyczne rozwiązanie różnych problemów tworzenie obiektów w programowaniu obiektowym . Celem wzorca projektowego Builder jest oddzielenie konstrukcji złożonego obiektu od jego reprezentacji. Jest to jeden z wzorców projektowych Gangu Czterech .

Przegląd

Wzorzec projektowy Builder jest jednym z wzorców projektowych GoF opisujących sposób rozwiązywania powtarzających się problemów projektowych w oprogramowaniu obiektowym.

Wzorzec projektowy Builder rozwiązuje takie problemy jak:

  • Jak klasa (ten sam proces konstrukcyjny) może tworzyć różne reprezentacje złożonego obiektu?
  • Jak uprościć klasę, która obejmuje tworzenie obiektu złożonego?

Tworzenie i składanie części złożonego obiektu bezpośrednio w klasie jest nieelastyczne. Zobowiązuje klasę do stworzenia określonej reprezentacji obiektu złożonego i uniemożliwia późniejszą zmianę reprezentacji niezależnie od (bez konieczności zmiany) klasy.

Wzorzec projektowy Builder opisuje, jak rozwiązać takie problemy:

  • Hermetyzuj tworzenie i składanie części złożonego obiektu w oddzielny Builderobiekt.
  • Klasa deleguje tworzenie obiektów do Builderobiektu zamiast bezpośrednio tworzyć obiekty.

Klasa (ten sam proces konstrukcyjny) może delegować do różnych Builderobiektów, aby utworzyć różne reprezentacje złożonego obiektu.

Definicja

Celem wzorca projektowego Builder jest oddzielenie konstrukcji złożonego obiektu od jego reprezentacji. W ten sposób ten sam proces konstrukcyjny może tworzyć różne reprezentacje.

Zalety

Zalety wzorca Builder to:

  • Pozwala zmieniać wewnętrzną reprezentację produktu.
  • Hermetyzuje kod do budowy i reprezentacji.
  • Zapewnia kontrolę nad etapami procesu budowlanego.

Niedogodności

Wady wzorca Builder obejmują:

  • Dla każdego typu produktu należy utworzyć odrębny ConcreteBuilder.
  • Klasy konstruktora muszą być zmienne.
  • Może utrudniać/skomplikować wstrzykiwanie zależności.

Struktura

Diagram klas i sekwencji UML

Przykładowy diagram klas i sekwencji UML dla wzorca projektowego Builder.

W powyższym UML schemacie klasy The Directorklasa nie tworzyć i zmontować ProductA1i ProductB1obiektów bezpośrednio. Zamiast tego Directorodnosi się do Builderinterfejsu do budowania (tworzenia i składania) części złożonego obiektu, co Directoruniezależnia od tego, które konkretne klasy są tworzone (jaka reprezentacja jest tworzona). Builder1Klasy realizuje Builderinterfejs tworząc i montowania ProductA1i ProductB1obiektów.
W UML Schemat sekwencji pokazuje interakcje Run-Time: Directorcalls obiektu buildPartA()na Builder1obiekt, który tworzy i montuje ProductA1obiektu. Następnie Directorrozmowy buildPartB()na temat Builder1, który tworzy i montuje ProductB1obiekt.

Diagram klas

Struktura budowniczego
Budowniczy
Abstrakcyjny interfejs do tworzenia obiektów (produktów).
BetonBudowniczy
Zapewnia implementację dla Buildera. Jest obiektem zdolnym do konstruowania innych obiektów . Konstruuje i montuje części do budowy obiektów.

Przykłady

Przykład C# :

/// <summary>
/// Represents a product created by the builder
/// </summary>
public class Bicycle
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Height { get; set; }
    public string Colour { get; set; }

    public Bicycle(string make, string model, string colour, int height)
    {
        Make = make;
        Model = model;
        Colour = colour;
        Height = height;
    }
}

/// <summary>
/// The builder abstraction
/// </summary>
public interface IBicycleBuilder
{
    string Colour { get; set; }
    int Height { get; set; }

    Bicycle GetResult();
}

/// <summary>
/// Concrete builder implementation
/// </summary>
public class GTBuilder : IBicycleBuilder
{
    public string Colour { get; set; }
    public int Height { get; set; }

    public Bicycle GetResult()
    {
        return Height == 29 ? new Bicycle("GT", "Avalanche", Colour, Height) : null;        
    }
}

/// <summary>
/// The director
/// </summary>
public class MountainBikeBuildDirector
{
    private IBicycleBuilder _builder;
    public MountainBikeBuildDirector(IBicycleBuilder builder) 
    {
        _builder = builder;
    }

    public void Construct()
    {
        _builder.Colour = "Red";
        _builder.Height = 29;
    }

    public Bicycle getResult()
	{
		return this._builder.GetResult();
	}
}

public class Client
{
    public void DoSomethingWithBicycles()
    {
        var builder = new GTBuilder();
        var director = new MountainBikeBuildDirector(builder);

        // Director controls the stepwise creation of product and returns the result.
        director.Construct();
        Bicycle myMountainBike = director.GetResult();
    }
}

Dyrektor montuje instancję rowerową w powyższym przykładzie, delegując budowę do oddzielnego obiektu budowniczego, który został przekazany Dyrektorowi przez Klienta.

Zobacz też

Bibliografia

  1. ^ B Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Wzorce projektowe: elementy oprogramowania obiektowego wielokrotnego użytku . Addisona Wesleya. s.  97 i nast . Numer ISBN 0-201-63361-2.CS1 maint: wiele nazwisk: lista autorów ( link )
  2. ^ "Wzorzec projektowy Builder - problem, rozwiązanie i zastosowanie" . w3sDesign.com . Pobrano 13.08.2017 .
  3. ^ a b „Indeks / archiwum/2010/zima/51023-1/prezentacje” (PDF) . www.classes.cs.uchicago.edu . Pobrano 2016-03-03 .
  4. ^ "Wzorzec projektowy Builder - Struktura i współpraca" . w3sDesign.com . Pobrano 12.08.2017 .

Zewnętrzne linki