Builder pattern

Builder – Definition

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

Gang of four (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)

Builder – Pseudocode

// Es gilt die Anforderung ein konkretes Objekt zu erstellen. Dies sollte jedoch
// bereits ein komplexes Objekt darstellen, da für ein einfaches Objekt einfach
// zu viel Logik implementiert werden muss.
class Product
	field parts : array
	method addPart(what)
		parts.add(what)
		
// in dem Builder Interface, werden die einzelnen Teilbereiche definiert, wie
// das fertige Objekt aussehen soll
interface Builder
	// mit der reset-methode, kann man das Produkt in den Ursprungszustand 
	// zurücksetzen, um weitere Produkte zu erstellen
	method reset()
	// Das fertige Objekt kann mithilfe von getResult abgeholt werden.
	// in der Regel wird am Ende von getResult noch einmal die reset
	// Methode aufgerufen, damit man ein neues Objekt erstellen kann.
	method getResult() returns Product
	// Jeder Builder benötigt Methoden, die zum erstellen dienen
	method buildPart1()
	method buildPart2()
	method buildPart3()
	
// Ein konkreter Erzeuger legt fest, wie das Produkt (bzw. die Einzelteile)
// davon erzeugt werden sollen. In einer großen Applikation können mehrere
// solcher Builder vorhanden sein um ein einzelnes Objekt zu erstellen
class ConcreteBuilder implements Builder
	field product
	
	method reset()
		product = new Product
	
	method getResult() returns Product
		product = this.product
		this.reset()
		return product
	
	method buildPart1()
		product.addPart(part1)
	
	method buildPart2()
		product.addPart(part2)
	
	method buildPart3()
		product.addPart(part3)

// Der Director definiert, zusammen mit dem Erbauer das Produkt. Man kann es
// wie eine "Definition of Done" ansehen. Dabei kann man es im Nachhinein noch
// weiter erweitern. Jedoch nicht mehr weiter einschränken.
class Director
	method construct1(builder)
		builder.buildPart1()
		
	method construct123(builder)
		builder.buildPart1()
		builder.buildPart2()
		builder.buildPart3()

program Client
	// Der Aufruf benötigt beides, den Builder und den Director.
	director = new Director()
	builder = new ConcreteBuilder()
	// Der Director gibt dem Builder genaue Instruktionen, wie dieser ein 
	// bestimmtes Produkt erbauen soll.
	director.construct1(builder)
	p1 = builder.getResult()
	
	director.construct123(builder)
	p2 = builder.getResult()
	// ein Builder kann auch "auf eigene Faust" und ohne die Verwendung eines Directors
	// das Produkt erstellen oder aber auch nach dem Erstellen eines Produkts
	// noch weiteres fine-tuning betreiben.
	builder.buildPart2()
	builder.buildPart3()
	p3 = builder.getResult()