пример для шаблона Singleton - PullRequest
1 голос
/ 19 марта 2010

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

Ответы [ 7 ]

4 голосов
/ 19 марта 2010

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

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

1 голос
/ 19 марта 2010

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

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

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

1 голос
/ 19 марта 2010

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

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

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

1 голос
/ 19 марта 2010

Да, но только если все потоки обращаются к одному и тому же файлу, и вы используете пользовательскую реализацию (не 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 голосов
/ 13 марта 2015
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"); 
   }
}
0 голосов
/ 13 июня 2014

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

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 голосов
/ 19 марта 2010

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

-Arun

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...