2012-09-20 43 views
5

Tôi tự hỏi liệu tôi có thể triển khai mẫu thiết kế Builder nhưng không có giao diện/lớp trừu tượng mà từ đó tôi lấy được các nhà xây dựng bê tông? Tôi có thể chỉ có một người xây dựng không?Builder design pattern - Không có lớp trừu tượng/giao diện

Nếu tôi chỉ có một concretebuilder và đạo diễn là nó vẫn là mô hình thiết kế xây dựng?

Cụ thể hơn:

Tôi có một số đối tượng mà tôi muốn "ghép lại" với đối tượng phức tạp. Là chính xác hơn tôi có các lớp sau:

Door tường Phòng

Tôi muốn xây dựng một "thế giới" ra khỏi những classe, đó là tất cả các lớp kết hợp mang lại cho tôi một thế giới.

Cảm ơn

Trả lời

2

Bạn có thể kết hợp các mô hình xây dựng với visitor pattern: Vượt qua một số loại cây dữ liệu đến các nhà xây dựng, mỗi trong số đó thực hiện một phương pháp accept(Visitor v), và có người xây dựng bước đi trên cây đi qua mỗi nút trở lại khách truy cập thông qua phương thức chấp nhận.

+0

Xin chào. Im chỉ được phép sử dụng mẫu trình xây dựng. – mrjasmin

2

Nếu tôi chỉ có một concretebuilder và đạo diễn thì đó vẫn là mẫu thiết kế của người xây dựng?

Tôi sẽ không bị treo câu hỏi này ngay từ đầu. Nếu dự án của bạn chỉ yêu cầu một loại "thế giới" được xây dựng và bạn thực sự không cần nhiều lớp con xây dựng, thì việc sử dụng một giám đốc và một người xây dựng cụ thể là một cách tiếp cận hợp lệ. Thay vào đó tập trung vào tinh thần của mô hình - cụ thể là cô lập đạo diễn của bạn từ các chi tiết về cách thế giới nên được xây dựng.

Khi mã của bạn đang hoạt động và bạn hài lòng với kết quả, hãy quay lại và xem lại cách giám đốc và người xây dựng của bạn thực sự tương tác. Sau đó, xem xét tái cấu trúc trình xây dựng để trích xuất một giao diện chung để thực sự làm dịu hợp đồng giữa giám đốc và người xây dựng.

Tôi thấy dễ dàng hơn khi trích xuất một giao diện hợp lý từ lớp bê tông đang hoạt động, sau đó thử đoán trước giao diện này có thể là gì và cố gắng phát triển giao diện và lớp học cùng một lúc.

3

Có, tuyệt đối bạn có thể có một công việc đơn giản của WorldBuilder là tạo ra một thế giới được cấu hình đầy đủ bao gồm Cửa, Tường và Phòng. Điều này rất hữu ích khi bạn không muốn có một đối tượng thế giới được xây dựng một phần và có thể không hợp lệ.

Hãy nói rằng việc sử dụng của người xây dựng là như thế này:

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

Một cách tiếp cận phi xây dựng có thể muốn làm một cái gì đó như thế này để kết nối hai phòng các đối tượng:

Door door = new Door(roomOne, roomTwo); 

Nhưng nếu bạn đang lặp lại từng phòng từ một tệp như trước đó, bạn sẽ không có tham chiếu đến phòng thứ hai vì nó có thể chưa đạt được.

Một phương pháp khác là để cho mỗi đối tượng chỉ ID của hàng xóm hoặc cha mẹ của nó, do đó bạn có được điều này thay vào đó, cho phép bạn tham khảo một đối tượng mà chưa được nạp nào:

Door door = new Door(roomOneId, roomTwoId); 

Nhưng nếu đã xảy ra lỗi trong tệp và phòng 2 chưa bao giờ được xác định thì Thế giới sẽ không hợp lệ. Nhà xây dựng có thể quản lý tất cả các chi tiết về việc xây dựng, kết nối và xác nhận hợp lệ quy trình tạo thế giới, cấp tính linh hoạt cho mã máy khách muốn tạo ra thế giới và giải phóng đối tượng thế giới của logic xây dựng phức tạp.

+0

Cảm ơn. Đây là aproach tôi xem xét. Tôi cho rằng tôi không cần một giám đốc? – mrjasmin

+0

Tôi sẽ nói mã mẫu mà tôi đã đăng lặp lại một tệp XML sẽ là giám đốc. Bạn có thể dễ dàng có một đạo diễn khác lấy dữ liệu từ một DB. Builder có thể giữ nguyên trong cả hai trường hợp, cho phép một sự tách biệt rõ ràng giữa đạo diễn và người xây dựng. – tcarvin

Các vấn đề liên quan