2015-11-10 3 views
4

Я пытаюсь изучить шаблон дизайна Singleton, и я натолкнулся на следующий пример. Однако кажется, что я могу создать несколько экземпляров класса.Создание экземпляра Singleton, создающего несколько объектов

Я думал, что точка одного синглтона должна позволять создавать только один экземпляр класса в любой момент времени. Может ли кто-нибудь объяснить, что мне здесь не хватает? Как я могу проверить, что в любой момент времени создается только один объект?

public class ChocolateBoiler { 
    private boolean empty; 
    private boolean boiled; 

    private static ChocolateBoiler uniqueInstance; 

    private ChocolateBoiler(){ 
     empty = true; 
     boiled = false; 
    } 

    public static synchronized ChocolateBoiler getInstance(){ 
     if(uniqueInstance == null){ 
      uniqueInstance = new ChocolateBoiler(); 
     } 
     return uniqueInstance; 
    } 

    public void fill(){ 
     if(isEmpty()){ 
      System.out.println("filling"); 
      empty = false; 
      boiled = false; 

     } 
     System.out.println("already full"); 
    } 

    public boolean isEmpty(){ 
     System.out.println("empty"); 
     return empty; 

    } 

    public boolean isBoiled(){ 
     System.out.println("boiled"); 
     return boiled; 
    } 

    public void drain() { 
     if (!isEmpty() && isBoiled()) { 
      System.out.println("draining"); 
      empty = true; 
     } 
     System.out.println("already empty"); 
    } 

    public void boil(){ 
     if(!isEmpty() && isBoiled()){ 
      System.out.println("boiled"); 
      boiled = true; 
     } 
     System.out.println("either empty or not boiled?"); 
    } 

    public static void main(String[] args) { 
     ChocolateBoiler boiler1 = new ChocolateBoiler(); 
     boiler1.fill(); 
     boiler1.boil(); 
     boiler1.boil(); 
     boiler1.drain(); 
     boiler1.drain(); 
     boiler1.isEmpty(); 


     System.out.println("\nboiler 2"); 
     ChocolateBoiler boiler2 = new ChocolateBoiler(); 
     boiler2.fill(); 

     System.out.println("\nboiler 1"); 
     boiler1.isBoiled(); 
    } 
} 
+1

Почему, по вашему мнению, создается два экземпляра? –

+0

Ваш одноэлементный шаблон правильный, вы должны вызывать его из других классов –

ответ

8

Внутри ChocolateBoiler класса у вас есть доступ к закрытому конструктору, так что вы можете создать столько экземпляров, как вам нравится (как вы демонстрируете в методе main).

Точка шаблона Singleton заключается в том, что вне вашего класса может быть получен только один экземпляр ChocolateBoiler (с помощью метода getInstance), поскольку к нему нельзя получить доступ к внешнему конструктору.

+0

Gotcha! Я знал, что это будет что-то простое. Спасибо. –

+0

Итак, я попытался использовать 'ChocolateBoiler tmp = ChocolateBoiler.getInstance();' и я получаю странную небольшую ошибку «Исключение в потоке» main «java.lang.NoSuchMethodException: DesignPatterns.Singleton.ChocolateBoiler.main ([Ljava. lang.String;) \t at java.lang.Class.getMethod (Class.java:1786) \t at com.intellij.rt.execution.application.AppMain.main (AppMain.java:125) 'который является' throw new NoSuchMethodException (getName() + "." + name + argumentTypesToString (parameterTypes)); любая идея? –

+0

@MichaelQuatrani Это похоже на проблему очистки старых компиляций. Вы переместили свой основной метод в новый класс? Как выглядит ваш новый код? – Eran

Смежные вопросы