Singleton модель

Дизайн шаблон является общим решением общих проблем в проектировании программного обеспечения. Идея в том, что решение получает переведены на код, и что код может быть применен в разных ситуациях, когда возникает проблема. Обсуждение паттернов проектирования началось с шаблонами книга Дизайн: Приемы объектно-ориентированного программного обеспечения Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Vlissides. Эти четыре авторы известны как "Банда четырех" или просто "GoF". В своей книге GoF категориям моделей в различных предметных областях, которые существуют три основные области: творения, структурные и поведенческие. Порождающие модели описывают, как объекты создаются (или "экземпляры" в объектно-ориентированной терминологии). Структурные модели предлагают помощь в том, как подключить и объединить объекты. Поведенческая модель описывает алгоритмы или механизмы связи. Некоторые распространенные имена модели являются одной точки в области творения наблюдатель в поведенческой области, и фасадом в структурной области. Эта техническая Совет описывает шаблон Singleton строго в контексте языка программирования Java.

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

Если вы знаете, один экземпляр время будет создан подкласс сделать родительском классе абстрактных и обеспечить метод для получения текущего экземпляра. Примером этого является Инструментарий класс в пакете AWT. Конструктор для Toolkit является общественное (конструктор по умолчанию в данном конкретном случае):

public Toolkit()

и класс имеет getDefaultToolkit () для получения конкретного подкласса — в этом случае, подкласс для конкретной платформы:

public static Toolkit getDefaultToolkit()

На платформе Linux с Sun Java Runtime, конкретный подкласс типа sun.awt.X11.XToolkit. Однако вам не нужно знать, потому что вы только к классу через свой общий абстрактный класс, родитель, Toolkit.

Класс Collator является еще одним примером этой тенденции, с небольшой разницей. Он предлагает два GetInstance () методы. Без аргументов версии получает Collator локализация по умолчанию. Вы можете передать в вашей собственной локали, чтобы получить экземпляр Collator для той местности. Запрос Collator по той же локали несколько раз и вы получите тот же инстанции Collator. Защищен сам конструктор. Подобные способы ограничения создания класса можно найти во всем J2SE стандартные библиотеки.

На этом этапе вы можете подумать, что ограничение доступа к конструктору класса автоматически делает ее Singleton. Это не так. Примером тому является календарный класс. Защищен конструктор календарь класс и класс предлагает GetInstance () для получения экземпляра класса. Тем не менее, каждый вызов GetInstance () получает новый экземпляр класса. Так что это не Singleton.

Когда вы создаете свой собственный класс Singleton, убедитесь, что только в одном экземпляре когда-либо созданных:


   public class MySingleton {

     private static final MySingleton INSTANCE = 

       new MySingleton();



     private MySingleton() {

     }



     public static final MySingleton getInstance() {

       return INSTANCE;

     }

   }

Статический метод, GetInstance (), возвращает единственный экземпляр класса. Обратите внимание, что даже если один экземпляр должен быть подклассом, Вам не нужно менять API.

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

Это не совсем все, что для создания Singleton. Если вы хотите сделать ваш класс Serializable Singleton, вы должны предоставить readResolve () метод:


  /**

   * Ensure Singleton class

   */

  private Object readResolve() throws ObjectStreamException {

    return INSTANCE;

  }

С readResolve () в месте, десериализация результатов в один (и только один) объект — тот же объект, производится путем обращения к GetInstance () метода. Если вы не предоставите readResolve () метод, экземпляр объекта создается каждый раз, когда вы десериализации объекта.

Шаблон Singleton полезна, если вы знаете, что есть только один ресурс, и необходимо предоставить доступ к информации о состоянии этого единого ресурса. Выявления потребностей в шаблон Singleton на этапе проектирования можно упростить процесс разработки. Однако, иногда вы не знали о необходимости пока проблема производительности ведет вас к рефакторинг кода и использовать модель на более позднее время. Например, вы можете обнаружить, что производительность системы деградирует потому что ваша программа многократно создания экземпляров одного и того же класса проходят вдоль государственной информации. Путем изменения в шаблон Singleton, можно избежать воссоздавая тот же объект. Это освобождает время система используется для воссоздания объекта, и экономит время сборщик мусора должен освободить эти случаи.

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

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

Шаблон Singleton часто используется с другим шаблоном называемый шаблон Фабрика. Как шаблон Singleton, завод картина творения шаблону. Он описывает, как подклассы какого-либо объекта, или более обычно, исполнителями конкретного интерфейса, делать фактическое создание объекта. Хорошим примером шаблон Фабрика является класс Swing BorderFactory. Класс имеет ряд статические методы, возвращающие различные типы объектов границе. Она скрывает детали реализации подклассы, позволяя завод непосредственного вызова конструкторов для реализации интерфейса. Вот пример из BorderFactory в использовании:


   Border line = BorderFactory.createLineBorder(Color.RED);

   JLabel label = new JLabel("Red Line");

   label.setBorder(line);

Вот тот факт, что создает BorderFactory LineBorder, или как BorderFactory ли это, что скрыто от разработчика. В этом конкретном примере, Вы можете непосредственно вызвать конструктор LineBorder, но во многих случаях использование шаблон Фабрика, вы не можете.

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

Чтобы получить завода Синглтон, вы называете getSharedInstance () Метод PopupFactory:

PopupFactory factory = PopupFactory.getSharedInstance();

Затем вы создаете объект Popup с завода по телефону getPopup завода () метод, проходящие в родительский компонент, его содержания, и должность:

Popup popup = factory.getPopup(owner, contents, x, y);

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


   FileInputStream fis = new FileInputStream(filename);

   CertificateFactory cf = 

      CertificateFactory.getInstance("X.509");

   Collection c = cf.generateCertificates(fis);

Как показано с BorderFactory, завод шаблон не должны быть использованы с шаблоном Singleton. Однако наличие двух моделей часто используются вместе.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>