2009-05-24 41 views
6

Trên trang 175, có một ví dụ về lớp nồi hơi sô cô la. Một cái gì đó như thế này:Mẫu Singleton - nghi ngờ trong các mẫu thiết kế đầu mẫu đầu tiên

public class ChocolateBoiler { 

    private boolean empty; 
    private boolean boiled; 

    public ChocolateBoiler { 
    empty = true; 
    boiled = false; 
    } 
// and then three methods to fill, drain and boil which changes the 
// status of these two flag depending of situation 
} 

Trong phần "sức mạnh não bộ", họ đặt câu hỏi "Có thể xảy ra sự cố nếu có nhiều trường hợp của ChocolateBoiler được tạo trong ứng dụng?"

Tôi không chắc vấn đề với lớp học này là gì. Tại sao chúng tôi giới thiệu một mẫu đơn ở đây? Hai lá cờ này không phải là tĩnh và do đó mỗi cái một. Vậy làm thế nào tạo ra nhiều hơn một thể hiện có thể làm rối tung mọi thứ?

Trả lời

2

Câu hỏi không phải là về việc tạo một thể hiện của một đối tượng.

Đó là về sự nhầm lẫn gây ra bởi có hai trường hợp của đối tượng, cả hai đều có ý định có trạng thái của ChocolateBoiler.

Nếu một số đối tượng (ví dụ như bếp) nghĩ rằng nó có trạng thái của ChocolateBoiler và một số đối tượng khác (ví dụ: Công thức), nó có trạng thái của ChocolateBoiler, điều gì sẽ xảy ra bây giờ?

Vì các biến biến mẫu, các đối tượng ChocolateBoiler sẽ không đồng ý về trạng thái của ChocolateBoiler. Bây giờ chuyện gì xảy ra?

2

Nó chỉ là một vấn đề nếu chỉ có thể là một trong những ChocolateBoiler, và nếu chỉ có thể là một, nó phải là một singleton.

1

Tôi tin rằng trong ví dụ đó, bạn chỉ có duy nhất MỘT nồi hơi Chocolate. Và vì vậy bạn chỉ có thể tạo một thể hiện của đối tượng đại diện cho nó. Nếu bạn được phép tạo nhiều phiên bản, bạn có thể sẽ ra lệnh if (boiler.hotEnough()) boiler.stop() ở đâu đó trong hệ thống của bạn và sẽ ngạc nhiên rằng mặc dù lò hơi đã quá nóng, nó không dừng lại vì bạn đang nói chuyện với một số trường hợp 'chết' của Nồi hơi, trả về hotEnough(): sai.

Sử dụng mẫu đơn bạn đảm bảo rằng bất kể mã của bạn ở đâu trong Boiler.getInstance(), bạn sẽ nhận được đối tượng lò hơi duy nhất và đó là khi bạn nói chuyện với nó, nó sẽ làm Như bạn đã mong đợi.

+0

Cảm ơn các bạn đã trả lời. Có vẻ như tôi đã đối xử với câu hỏi này quá nhiều theo lập trình :) – alonzo

1

Toàn bộ ví dụ về chocolateboiler trong một singleton làm phiền tôi rất nhiều trong khi tôi đang đọc nó.

Ở cấp độ thực sự cơ bản, tôi không thấy lý do tại sao nó cần thiết khi bạn chỉ có một thứ vật lý, để thực thi thực tế đó trong phần mềm. Điều gì sẽ xảy ra nếu bạn nhận được một cái khác? bạn sẽ làm gì, thêm thứ hai vào cùng một singleton? làm 2 bộ khác nhau? một biến toàn cầu đơn giản sẽ thực hiện công việc.

IMO, bản thân nó không phải là nồi hơi mà bạn chỉ có thể có một thứ, truy cập vào các điều khiển của lò hơi cụ thể đó. Bạn không thể cho phép một người thứ hai bắt đầu thực hiện một mẻ sôcôla mới trong khi nó đã có trong quá trình đó cho người khác, hoặc thậm chí cho phép cùng một người thực hiện lô thứ hai trước khi lần đầu tiên kết thúc. Từ quan điểm đó, một hệ thống xử lý hàng đợi hoặc hàng loạt đơn giản sẽ thực hiện công việc. Sử dụng một mẫu khác từ cuốn sách, mẫu lệnh sẽ là một cách tốt hơn để xử lý nó, vì chỉ có một cô hầu bàn, và tất cả các đơn đặt hàng mới được xếp hàng cho đến khi nấu xong với thứ tự thực phẩm hiện tại. (er, nếu bạn chưa xem cuốn sách, những gì tôi vừa nói có thể không có ý nghĩa nhiều, xin lỗi)

Có lẽ tôi không nhận được điểm.Tôi đã không làm nhiều OOP hoặc bất cứ điều gì với các mẫu thiết kế trước đây, và tôi đang mất cơ hội việc làm vì nó, vì vậy tôi đang đọc nó.