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
Builder
obiekt. - Klasa deleguje tworzenie obiektów do
Builder
obiektu zamiast bezpośrednio tworzyć obiekty.
Klasa (ten sam proces konstrukcyjny) może delegować do różnych Builder
obiektó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
W powyższym UML schemacie klasy The Director
klasa nie tworzyć i zmontować ProductA1
i ProductB1
obiektów bezpośrednio. Zamiast tego Director
odnosi się do Builder
interfejsu do budowania (tworzenia i składania) części złożonego obiektu, co Director
uniezależnia od tego, które konkretne klasy są tworzone (jaka reprezentacja jest tworzona). Builder1
Klasy realizuje Builder
interfejs tworząc i montowania ProductA1
i ProductB1
obiektów.
W UML Schemat sekwencji pokazuje interakcje Run-Time: Director
calls obiektu buildPartA()
na Builder1
obiekt, który tworzy i montuje ProductA1
obiektu. Następnie Director
rozmowy buildPartB()
na temat Builder1
, który tworzy i montuje ProductB1
obiekt.
Diagram klas
- 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
- ^ 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 )
- ^ "Wzorzec projektowy Builder - problem, rozwiązanie i zastosowanie" . w3sDesign.com . Pobrano 13.08.2017 .
- ^ a b „Indeks / archiwum/2010/zima/51023-1/prezentacje” (PDF) . www.classes.cs.uchicago.edu . Pobrano 2016-03-03 .
- ^ "Wzorzec projektowy Builder - Struktura i współpraca" . w3sDesign.com . Pobrano 12.08.2017 .
Zewnętrzne linki
- Artykuł JavaWorld Budowanie interfejsów użytkownika bez programów pobierających i ustawiających ( Allen Holub ) przedstawia kompletny kod źródłowy Java dla konstruktora.