Tvůrce vzor - Builder pattern

The stavitelský vzor je návrhový vzor navržen tak, aby poskytoval flexibilní řešení různých problémů s vytvářením objektů v systému Windows objektově orientované programování. Záměrem návrhového vzoru Builderu je být samostatný konstrukce komplexního objektu z jeho reprezentace. Je to jeden z Gang čtyř návrhových vzorů.

Přehled

Návrhový vzor Builderu je jedním z GoF návrhové vzory[1] které popisují, jak řešit opakující se konstrukční problémy v objektově orientovaném softwaru.

Návrhový vzor Builderu řeší problémy jako:[2]

  • Jak může třída (stejný konstrukční proces) vytvořit různé reprezentace složitého objektu?
  • Jak lze zjednodušit třídu, která zahrnuje vytvoření složitého objektu?

Vytváření a sestavování částí složitého objektu přímo ve třídě je nepružné. Zaváže třídu k vytvoření konkrétní reprezentace komplexního objektu a znemožňuje pozdější změnu reprezentace nezávisle na třídě (aniž by bylo nutné ji měnit).

Návrhový vzor Builderu popisuje, jak takové problémy vyřešit:

  • Zapouzdřte vytvoření a sestavení částí složitého objektu v samostatném Stavitel objekt.
  • Třída deleguje vytvoření objektu na a Stavitel namísto přímého vytváření objektů.

Třída (stejný proces výstavby) může delegovat na různé Stavitel objekty k vytvoření různých reprezentací komplexního objektu.

Definice

Záměrem návrhového vzoru Builderu je oddělit konstrukci složitého objektu od jeho reprezentace. Tímto způsobem může stejný konstrukční proces vytvořit různé reprezentace.[1]

Výhody

Mezi výhody modelu Builder patří:[3]

  • Umožňuje měnit interní zastoupení produktu.
  • Zapouzdřuje kód pro konstrukci a reprezentaci.
  • Poskytuje kontrolu nad kroky procesu výstavby.

Nevýhody

Nevýhody modelu Builder zahrnují:[3]

  • Vyžaduje vytvoření samostatného ConcreteBuilderu pro každý jiný typ produktu.
  • Vyžaduje, aby třídy tvůrců byly proměnlivé.
  • Vkládání závislostí může být méně podporováno.

Struktura

Třída a sekvenční diagram UML

Ukázkový diagram třídy UML a sekvence pro návrhový vzor Builderu.[4]

Ve výše uvedeném UML třídní diagram, Ředitel třída nevytváří a nesestavuje Produkt A1 a Produkt B1 objekty přímo. Místo toho Ředitel Odkazuje na Stavitel rozhraní pro sestavování (vytváření a sestavování) částí složitého objektu, které tvoří Ředitel nezávisle na tom, které konkrétní třídy jsou vytvořeny (která reprezentace je vytvořena) Stavitel1 třída implementuje Stavitel rozhraní vytvořením a sestavením Produkt A1 a Produkt B1 předměty.
The UML sekvenční diagram ukazuje interakce za běhu: Ředitel volání objektu buildPartA () na Stavitel1 objekt, který vytváří a sestavuje Produkt A1 poté Ředitel hovory buildPartB () na Stavitel1, který vytváří a sestavuje Produkt B1 objekt.

Diagram tříd

Struktura stavitele
Stavitel
Abstraktní rozhraní pro vytváření objektů (produktu).
ConcreteBuilder
Poskytuje implementaci pro Builder. Je to objekt schopný postavit další objekty. Konstruuje a sestavuje součásti pro sestavení objektů.

Příklady

C#

/// /// Představuje produkt vytvořený tvůrcem/// veřejnost třída Auto{    veřejnost tětiva Udělat { dostat; soubor; }    veřejnost tětiva Modelka { dostat; soubor; }    veřejnost int NumDoors { dostat; soubor; }    veřejnost tětiva Barva { dostat; soubor; }    veřejnost Auto(tětiva udělat, tětiva Modelka, tětiva barva, int numDoors)    {        Udělat = udělat;        Modelka = Modelka;        Barva = barva;        NumDoors = numDoors;    }}/// / / / Abstrakce stavitele/// veřejnost rozhraní ICarBuilder{    tětiva Barva { dostat; soubor; }    int NumDoors { dostat; soubor; }    Auto GetResult();}/// / / / Implementace betonu/// veřejnost třída FerrariBuilder : ICarBuilder{    veřejnost tětiva Barva { dostat; soubor; }    veřejnost int NumDoors { dostat; soubor; }    veřejnost Auto GetResult()    {        vrátit se NumDoors == 2 ? Nový Auto("Ferrari", "488 Spider", Barva, NumDoors) : nula;            }}/// /// Režisér/// veřejnost třída SportsCarBuildDirector{    soukromé ICarBuilder _stavitel;    veřejnost SportsCarBuildDirector(ICarBuilder stavitel)     {        _stavitel = stavitel;    }    veřejnost prázdnota Postavit()    {        _stavitel.Barva = "Červené";        _stavitel.NumDoors = 2;    }}veřejnost třída Klient{    veřejnost prázdnota DoSomethingWithCars()    {        var stavitel = Nový FerrariBuilder();        var ředitel = Nový SportsCarBuildDirector(stavitel);        ředitel.Postavit();        Auto myRaceCar = stavitel.GetResult();    }}

Ředitel sestavuje instanci automobilu ve výše uvedeném příkladu a deleguje konstrukci na samostatný objekt stavitele, který byl zadán řediteli klientem.

Viz také

Reference

  1. ^ A b Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Návrhové vzory: Prvky opakovaně použitelného objektově orientovaného softwaru. Addison Wesley. str.97ff. ISBN  0-201-63361-2.CS1 maint: více jmen: seznam autorů (odkaz)
  2. ^ „Návrhový vzor Builderu - problém, řešení a použitelnost“. w3sDesign.com. Citováno 2017-08-13.
  3. ^ A b "Rejstřík / archiv / 2010 / zima / 51023-1 / prezentace" (PDF). www.classes.cs.uchicago.edu. Citováno 2016-03-03.
  4. ^ „Návrhový vzor Builderu - struktura a spolupráce“. w3sDesign.com. Citováno 2017-08-12.

externí odkazy