2009-05-24 5 views
6

На странице 175 приведен пример класса шоколадного котла. Что-то вроде этого:Singleton pattern - сомнение в главе First Design Patterns book

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 
} 

В разделе «власть мозга» они задают вопрос: «Как все могло пойти не так, если более чем один экземпляр ChocolateBoiler создается в приложении?»

Я не уверен, в чем проблема с этим классом. Почему мы вводим здесь одноэлементный шаблон? Эти два флага не являются статическими и, следовательно, одним экземпляром. Итак, как создавать более одного экземпляра, может испортить вещи?

ответ

2

Вопрос не в создании экземпляра объекта.

Речь идет о путанице, вызванной наличием двух экземпляров объекта, оба из которых имеют статус ChocolateBoiler.

Если какой-либо объект (например, плита) считает, что у него есть статус ChocolateBoiler и какой-либо другой объект (например, рецепт), он имеет статус ChocolateBoiler, что происходит сейчас?

Поскольку переменные являются переменными экземпляра, объекты ChocolateBoiler не согласятся о статусе ChocolateBoiler. Теперь, что происходит?

2

Это проблема только в том случае, если может быть только один ChocolateBoiler, и если там может быть только один, это должен быть синглтон.

1

Я верю, что в этом примере у вас был только ОДИН шоколадный котел. И поэтому вы должны иметь возможность создать только один экземпляр объекта, представляющего его. Если вам разрешили создавать несколько экземпляров, вы, возможно, затем внесите команду if (boiler.hotEnough()) boiler.stop() где-нибудь в вашей системе и будете удивлены тем, что, хотя котел уже слишком горячий, он не останавливается, потому что вы говорите с каким-то «мертвым» экземпляром Котел, который возвращает hotEnough(): false.

Используя шаблон singleton, вы убедитесь, что независимо от того, где в вашем коде вы говорите, что Boiler.getInstance() вы получите единственный и единственный объект котла, и когда вы поговорите с ним, он будет делать как и следовало ожидать.

+0

Спасибо, ребята, за ваши ответы. Кажется, я рассматривал этот вопрос слишком много программно :) – alonzo

1

Весь пример шоколадного мороженого в синглтоне беспокоил меня много, пока я его читал.

На самом деле фундаментальный уровень, я не понимаю, почему это необходимо, когда у вас есть только одна физическая вещь, чтобы обеспечить соблюдение этого факта в программном обеспечении. Что произойдет, если вы получите еще один? что вы собираетесь делать, добавьте второе в тот же синглтон? сделать 2 разных синглтона? простая глобальная переменная выполнила бы эту работу.

IMO, его не сам котел, из которого вы можете иметь только одно, его доступа к этим конкретным элементам управления котла. Вы не можете позволить второму человеку начать делать новую порцию шоколада, пока он уже в этом процессе для кого-то другого, или даже позволить тому же человеку сделать вторую партию до того, как первая будет закончена. С этой точки зрения простую систему обработки очередей или пакетной обработки выполнила бы эту работу. Используя другой образец из книги, командный шаблон будет намного лучшим способом обработки, так как есть только одна официантка, и все новые заказы будут стоять в очереди до тех пор, пока повар не выполнит текущий заказ на питание. (э-э, если вы еще не видели книгу, то, что я только что сказал, не имеет смысла, извините)

Возможно, я просто не понимаю.Из-за этого я не делал много ООП или чего-либо с шаблонами дизайна, и я теряю возможности работы, поэтому я читаю об этом.