2010-03-19 5 views
1

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

ответ

1

Да, но только если все потоки получают доступ к одному файлу, и вы используете собственную реализацию (не java.io.File, возможно, обертка)

одноэлементный шаблон представляет собой шаблон дизайна, который используется для ограничения экземпляра класса к одному объекту

Одиночные игры (часто плохой выбор) - это классы, которые могут иметь только один экземпляр на протяжении всей программы.

Например, SingletonConfigFile может выглядеть следующим образом. Имейте в виду, что:

  • предназначен для чтения только одного файла. Было бы разумно, чтобы это был файл конфигурации.
  • Если ваш класс может быть создан несколько раз, для разных файлов он не является одиночным.
  • не используют этот код - он не учитывает проблемы параллелизма, которые являются совершенно другой областью обсуждения.

.

public SingletonConfigFile { 
    private static String filename = "config.xml"; 
    private File file; 
    private static SingletonConfigFile instance; 

    private SingletonConfigFile() { 
     if (instance != null) { 
      throw new Error(); 
     } 
     file = new File(filename); 
    } 

    public synchronized SingletonConfigFile getInstance() { 
     if (instance == null) { 
      instance = new SignletonConfigFile(); 
     } 
     return instance 
    } 

    public String read() { 
     // delegate to the underlying java.io.File 
    } 
} 

Но этот пример находится на краю смысла. Синглтоны используются в случаях, когда есть только один объект (как я уже говорил выше). Например, это имело бы смысл иметь:

  • RingOfPower.getInstance() - есть только одно кольцо силы (Саурона), и не может существовать больше.
  • Sun.getInstance() - только одна звезда под названием «солнце».
  • всех объектов в жгутах вашего приложения, которые логически должны существовать только один раз - это реестр, контекст приложения и т.д.
  • «Файл»
+0

то, что о моем примере выше файл? – JavaUser

+0

@JavaUser Я обновил свой ответ, чтобы уточнить ваш пример – Bozho

+0

@downvoter Я был бы признателен за ваше обоснование. – Bozho

4

А не является объект Java (и java.io.File определенно не синглтон). Я бы не думал о файлах на диске как о синглете - они просто разделяли ресурсы. В частности, это не так, как есть только один файл на диске :)

Более распространенным примером одноэлементного шаблона является конфигурация - или ведение журнала. Например, LogManager.getLogManager возвращает «the» LogManager, и вы не можете создавать новые. Аналогично, у вас может быть один общий объект конфигурации, к которому можно получить доступ статически. (В зависимой инжектированной системе конфигурация может, однако, , но не, однако, вместо этого каждому компоненту предоставляется бит конфигурации, в котором они нуждаются, чтобы им не приходилось брать «общий».)

+0

thx .. в любом случае журналы не написаны в отдельном файле, они записаны только в том же файле. Так я думаю, его синглтон .. что вы думаете? – JavaUser

+0

Синглтоны - это не файлы, а объекты. Одноэлементный объект может получить доступ к сотне файлов или вообще не может потребовать доступа к любому файлу – dbemerlin

1

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

Релаксация может быть классом с известным общесистемным единственным экземпляром (в дополнение к другим экземплярам, ​​которые вы можете создать).

java.io.File не является классом Singleton.

1

Singleton - это дизайн anti-pattern, в котором классу присваивается частный конструктор и специальная «getInstance()», «INSTANCE()» или «instance()» статическая функция, которая отвечает за возвращение (и, возможно, построение, в зависимости от того, используете ли вы ленивые одиночные игры или нет) единственный экземпляр объекта. Синглтоны часто приводят к раздуванию зависимостей, скрывая зависимости и затрудняя издевательство над классом singleton во время модульного тестирования или заменяя синглтон чем-то не одиночным, когда оказывается, что предположение о том, что объект должен быть одноточечным, Фактически.

Решение однотипного анти-шаблона - это использование так называемой «инъекции зависимостей». Вы можете найти этот Google Techtalk, озаглавленный Java on Guice, который объясняет инъекцию зависимостей, просвещать.

Существует еще одна форма одноэлементности, которая не связана с одноэлементным анти-шаблоном ... то есть, если вы только создаете один экземпляр класса и передаете его, но вы не принудительно использовать singleton-ness, используя статическую конструктивную функцию, тогда вы сделали класс эффективно singleton без блокировки себя в зависимости или предотвращения возможности того, что класс не будет использоваться позже. В Google Techtalk, о котором я говорил, ораторы упоминают эту форму singletonness в конце разговора.

0

В Java J2SE API - два класса Calendar и Runtime являются хорошими примерами реализации Singleton Pattern в реальном времени.

-Arun

+0

Можете ли вы объяснить мне причину? – JavaUser

+1

Календарь не является ничем. – Bozho

+0

Ограничение доступа к конструктору класса автоматически не делает его Singleton. Конструктор класса Calendar защищен, и класс предлагает метод getInstance() для получения экземпляра класса. Однако каждый вызов getInstance() получает новый экземпляр класса. Так что это не * Singleton * – Narayan

0

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

public class SingleTonDesignPattern { 
    public static SingleTonDesignPattern singleTon = null; 
    public Properties priperty = null; 

    private SingleTonDesignPattern() { 

    } 

    public static SingleTonDesignPattern getSingleTon() { 
     return singleTon; 
    } 

    public Properties getPriperty() { 
     return priperty; 
    } 

    public void setPriperty(Properties priperty) { 
     this.priperty = priperty; 
    } 

    public static synchronized SingleTonDesignPattern getSingleTonObject() { 
     if(singleTon == null) { 
      singleTon = new SingleTonDesignPattern(); 
      Properties properties1 = new Properties(); 
      try { 
       properties1.load(new FileInputStream("c:/labels.properties")); 
       singleTon.setPriperty(properties1); 
      } catch (FileNotFoundException ex) { 
       ex.printStackTrace(); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
     return singleTon; 
    } 

} 
0
public class Singleton { 

    private static Singleton singleton = new Singleton(); 

    /* A private Constructor prevents any other 
    * class from instantiating. 
    */ 
    private Singleton(){ } 

    /* Static 'instance' method */ 
    public static Singleton getInstance() { 
     return singleton; 
    } 
    /* Other methods protected by singleton-ness */ 
    protected static void demoMethod() { 
     System.out.println("demoMethod for singleton"); 
    } 
} 
Смежные вопросы