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

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

- 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
- ^ 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)
- ^ „Návrhový vzor Builderu - problém, řešení a použitelnost“. w3sDesign.com. Citováno 2017-08-13.
- ^ A b "Rejstřík / archiv / 2010 / zima / 51023-1 / prezentace" (PDF). www.classes.cs.uchicago.edu. Citováno 2016-03-03.
- ^ „Návrhový vzor Builderu - struktura a spolupráce“. w3sDesign.com. Citováno 2017-08-12.
externí odkazy
- Článek JavaWorld Vytvářejte uživatelská rozhraní bez getrů a setterů (Allen Holub ) zobrazuje kompletní zdrojový kód Java pro Builder.