2012-09-20 4 views
5

Zastanawiam się, czy mogę zaimplementować wzorzec projektowy Buildera, ale bez interfejsu/klasy abstrakcyjnej, z której czerpię konkretne konstruktory? Czy mogę po prostu mieć jednego budowniczego?Konstruktor - wzór bez abstrakcyjnej klasy/interfejsu

Jeśli mam tylko wytwórcę betonu i reżysera, czy nadal jest to wzór projektanta?

Aby być bardziej konkretne:

mam jakiś przedmiot, który chcę „ułożyła” do złożonego obiektu. Będąc bardziej precyzyjnym Mam następujące klasy:

Drzwi ścienna pokoju

Chcę zbudować „World” z tymi Classe, czyli wszystkie te zajęcia połączone daje mi świat.

Dzięki

Odpowiedz

2

Można połączyć wzór budowniczy z visitor pattern: Hasło jakieś drzewa danych do producenta, z których każdy realizuje metodę accept(Visitor v) i mają budowniczy chodzić drzewo przechodząc każdego węzła z powrotem do odwiedzający za pomocą metody akceptacji.

+0

Witam. Mogę tylko użyć wzorca budowniczego. – mrjasmin

2

Jeśli mam tylko wytwórcę betonu i reżysera, czy nadal jest to wzorzec projektanta?

Nie odkładałbym na to pytania od samego początku. Jeśli twój projekt wymaga tylko jednego typu "świata", a ty naprawdę nie potrzebujesz wielu podklas budowniczych, to używanie reżysera i jednego konkretnego budowniczego jest prawidłowym podejściem. Zamiast tego skoncentruj się na duchu wzorca - mianowicie na wyizolowaniu swojego reżysera ze szczegółów tego, jak powinien wyglądać świat.

Gdy kod działa, a wyniki są dla Ciebie satysfakcjonujące, wróć i sprawdź, w jaki sposób reżyser i konstruktor naprawdę wchodzą ze sobą w interakcje. Następnie rozważ refaktoryzację budowniczego, aby wyodrębnić wspólny interfejs, aby naprawdę umocnić kontrakt między reżyserem i budowniczym.

Uważam, że znacznie łatwiej jest wydobyć sensowny interfejs z działającej konkretnej klasy, a następnie spróbować odgadnąć, co to może być interfejs i spróbować jednocześnie opracować interfejs i klasę.

3

Tak, absolutnie możesz mieć prosty WorldBuilder, którego zadaniem jest stworzenie w pełni skonfigurowanego świata składającego się z Drzwi, Ścian i Pokoi. Jest to bardzo przydatne, gdy nie chcesz, aby częściowo zbudowany i prawdopodobnie nieważny obiekt Świata był odsłonięty.

Powiedzmy użycie konstruktora jest tak:

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(); 

Podejście non-budowniczy może chcieć zrobić coś takiego, aby połączyć dwa pokoje obiektów:

Door door = new Door(roomOne, roomTwo); 

ale jeśli Przetwarzałem każdy pokój z pliku, tak jak wcześniej, wtedy nie będziesz miał odniesienia do drugiego pokoju, ponieważ nie został jeszcze osiągnięty.

Alternatywnym podejściem jest dać każdy obiekt tylko identyfikator sąsiadami lub rodzica więc masz zamiast tego, który pozwala odwołać się do obiektu, który nie został jeszcze załadowany:

Door door = new Door(roomOneId, roomTwoId); 

ale jeśli wystąpił błąd w pliku, a pokój 2 nigdy nie został zdefiniowany, a świat byłby nieprawidłowy.

Konstruktor może zadbać o wszystkie szczegóły dotyczące prawidłowego konstruowania, łączenia i sprawdzania poprawności procesu tworzenia świata, zapewniając elastyczność kodu klienta, który chce tworzyć świat i oddzielając obiekt światowej złożonej logiki konstrukcyjnej.

+0

Dzięki. To jest podejście, które rozważałem. Przypuszczam, że nie potrzebuję dyrektora? – mrjasmin

+0

Powiedziałbym, że kod przykładowy, który napisałem, iteruje plik XML, byłby dyrektorem. Równie dobrze mógłbyś mieć innego dyrektora, który wyciągnąłby dane z DB. Konstruktor może pozostać taki sam w obu przypadkach, umożliwiając czysty rozdział między reżyserem i budowniczym. – tcarvin