Я читаю об одноэлементном шаблоне из моей книги (Head First Design Patterns), и я знаю, что использование этого шаблона подходит, если вам нужен только один экземпляр некоторого класса.
Но у меня есть небольшая проблема с введением проблемы в этой книге.
(Да, я думаю, что я могу процитировать часть этого здесь!?)Что не так, если вы не используете одноэлементный шаблон
шоколадная фабрика
Всем известно, что все современные шоколадные фабрики с компьютерным управлением шоколадные котлы. Работа котла заключается в том, чтобы принимать шоколад и молоко, доводить их до кипения и , затем передать их на следующий этап изготовления шоколадных батончиков.
Вот класс контроллера для промышленной прочности Choc-O-Holic, Inc. Шоколадный котел. Проверьте код; вы заметите, что они пытались сделать очень осторожны, чтобы не допустить, чтобы плохие вещи не происходили, например, слив 500 галлонов небумажной смеси или заполнение котла, когда он уже заполнен или кипятил пустой котел!
public class ChocolateBoiler {
private boolean empty;
private boolean boiled;
private ChocolateBoiler() {
empty = true;
boiled = false;
}
public void fill() {
if (isEmpty()) {
empty = false;
boiled = false;
// fi ll the boiler with a milk/chocolate mixture
}
}
public void drain() {
if (!isEmpty() && isBoiled()) {
// drain the boiled milk and chocolate
empty = true;
}
}
public void boil() {
if (!isEmpty() && !isBoiled()) {
// bring the contents to a boil
boiled = true;
}
}
public boolean isEmpty() {
return empty;
}
public boolean isBoiled() {
return boiled;
}
}
Да, и это их вопрос:
Choc-O-Holic сделал приличную работу по обеспечению плохих вещей не случаются, не я думаю ? Опять же, вы, вероятно, подозреваете, что если два случая ChocolateBoiler потерялись, могут произойти некоторые очень плохие вещи.
Как все может пойти не так, если в приложении создано более одного экземпляра ChocolateBoiler ?
Таким образом, проблема «произойдет», когда мы делаем это:
ChocolateBoiler boiler1 = new ChocolateBoiler(),
boiler2 = new ChocolateBoiler();
//...
Но я вижу, что эти два случая контролировать свое собственное поведение, и они работают независимо друг от друга (потому что не статическое поле здесь).
Таким образом, они запускаются отдельно без эффекта для других.
Интересно, что эта проблема связана с незаконным состоянием или что-то может случиться, когда один экземпляр запускается и воздействует на других («неправильное поведение программы, чрезмерное использование ресурсов или непоследовательные результаты», из книги), но его здесь нет
Итак, How might things go wrong here?
, это просто расточительный пример?
если два экземпляра ChocolateBoiler теряют силу, могут возникнуть некоторые очень плохие вещи .
Я хочу видеть, как это происходит bad things
?
#Edit 1: Спасибо всем за помощь. Я выяснил, в чем моя проблема,
Когда я звоню boiler2 = new ChocolateBoiler()
, экземпляр boiler2
все еще относится к тому же строителю, что и bolder1, не так ли?
Первый раз, когда я думаю, что new ChocolateBoiler()
похоже, чтобы купить новый котел :)
Речь идет о концепции, и я новичок здесь
Есть только один котел. Что происходит, когда две вещи пытаются контролировать один котел? –
Да, две вещи пытаются контролировать один котел, могут получить незаконное состояние, но их вопрос связан с проблемой, когда создано более одного экземпляра ChocolateBoiler? – phibao37
Существует один котел с двумя предметами, которые пытаются его контролировать. –