2012-09-20 11 views
5

Ich frage mich, ob ich das Builder-Design-Muster implementieren kann, aber ohne eine Schnittstelle/Abstract-Klasse, von der ich konkrete Builder herleite? Kann ich nur einen Baumeister haben?Builder Entwurfsmuster - Keine abstrakte Klasse/Schnittstelle

Wenn ich nur einen Betonbauer und einen Direktor habe, ist es immer noch das Builder-Design-Muster?

Um genauer zu sein:

Ich habe einiges Objekt, das ich will „zusammen“ zu einem komplexen Objekt. Sein genau Ich habe die folgenden Klassen:

Tür Wand Zimmer

ich eine „Welt“ aus diesen classe aufbauen will, ist, dass alle diese kombinierten Klassen geben mir eine Welt.

Dank

Antwort

2

Sie konnten die Erbauer mit dem visitor pattern kombinieren: Pass eine Art von Datenbaum zum Baumeister, von denen jeder implementiert ein accept(Visitor v) Verfahren und haben die Baumeister zu Fuß den Baum jeden Knoten zurück in die Weitergabe Besucher über die Methode accept.

+0

Hallo. Ich darf nur das Builder-Muster verwenden. – mrjasmin

2

Wenn ich nur einen Betonbauer und einen Direktor habe, ist es immer noch das Builder-Design-Muster?

Ich würde nicht auf diese Frage am Anfang hängen. Wenn Ihr Projekt nur einen Typ von "Welt" erfordert und Sie wirklich nicht mehrere Builder-Unterklassen benötigen, dann ist die Verwendung eines Directors und eines einzelnen Beton-Builders ein gültiger Ansatz. Konzentrieren Sie sich stattdessen auf den Geist des Musters - nämlich Ihren Regisseur von den Details zu trennen, wie die Welt aufgebaut werden sollte.

Sobald Ihr Code funktioniert und Sie mit den Ergebnissen zufrieden sind, gehen Sie zurück und überprüfen Sie, wie Ihr Director und Builder wirklich interagieren. Ziehen Sie in Betracht, den Builder neu zu strukturieren, um eine gemeinsame Schnittstelle zu extrahieren, um den Vertrag zwischen dem Director und dem Builder wirklich zu fixieren.

Ich finde es viel einfacher, eine sinnvolle Schnittstelle aus einer funktionierenden konkreten Klasse zu extrahieren, dann zu versuchen, zu erraten, was diese Schnittstelle sein könnte und versuchen, die Schnittstelle und die Klasse gleichzeitig zu entwickeln.

3

Ja, absolut können Sie einen einfachen WorldBuilder haben, dessen Aufgabe es ist, eine vollständig konfigurierte Welt aus Türen, Wänden und Räumen zu erstellen. Dies ist sehr nützlich, wenn Sie ein teilweise erstelltes und möglicherweise ungültiges World-Objekt nicht verfügbar machen möchten.

Lasst uns sagen, dass die Nutzung des Erbauers ist wie folgt:

WorldBuilder builder = new WorldBuilder(); 

// read the definition of a room from an XML file or other source. 
// this is vastily simplified, you'd probably be iteration 
// something like this: 
// 
// for each Room in file 
//  for each wall in room 
//   for each door in wall 
// 
roomId = readRoomId(); 
wallId = readWallId(); 
doorId = readDoorId(); 
destRoomId = readDestinationRoomId(); 

builder.AddRoom(roomId); 
builder.AddWallToRoom(roomId, wallId, SIDE.NORTH); 
builder.AddDoorToWall(wallId, DOORSTYLE.WOODEN | DOORSTYLE.LOCKED, destRoomId); 

// etc, etc 

World world = builder.makeWorld(); 

Ein Nicht-Builder-Ansatz wollen könnte, so etwas tun, zwei Zimmer zu verbinden Objekte:

Door door = new Door(roomOne, roomTwo); 

Aber wenn Sie Ich wiederhole jeden Raum aus einer Datei wie zuvor, dann haben Sie keinen Bezug mehr auf den zweiten Raum, weil er vielleicht noch nicht einmal erreicht wurde.

Ein alternativer Ansatz ist jedes Objekt nur die ID ihrer Nachbarn oder Eltern zu geben, so dass Sie diese stattdessen bekommen, die Sie auf ein Objekt beziehen können, die noch nicht geladen ist:

Door door = new Door(roomOneId, roomTwoId); 

Aber wenn Es gab einen Fehler in der Datei und Raum 2 wurde nie definiert, dann wäre die Welt ungültig.

Der Builder kann sich um alle Details kümmern, um den Weltenerstellungsprozess korrekt zu konstruieren, zu verbinden und zu validieren, Flexibilität für den Clientcode zu gewähren, der die Welt erschaffen und das Weltobjekt der komplexen Konstruktionslogik freigeben möchte.

+0

Danke. Dies ist die Vorgehensweise, die ich in Betracht gezogen habe. Ich nehme an, dass ich keinen Regisseur brauche? – mrjasmin

+0

Ich würde sagen, der Beispielcode, den ich gepostet habe, der eine XML-Datei iteriert, wäre der Director. Sie könnten genauso gut einen anderen Director haben, der seine Daten aus einer Datenbank bezieht. Der Builder könnte in beiden Fällen gleich bleiben und eine saubere Trennung zwischen Regisseur und Erbauer ermöglichen. – tcarvin

Verwandte Themen