Читайте также: |
|
Определяет стандартный метод создания объекта, не связанный с вызовом конструктора, оставляя решение о том, какой именно объект создавать за подклассами.
При этом классу, который будет вызывать статический метод ProductFactory.createProduct() нет необходимости знать какой конкретно экземпляр будет возвращён, он будет работать только с интерфейсом:
…
Product product = ProductFactory.createProduct();
//do something with the product
…
Реализация метода createProduct() может создавать тот или иной подкласс интерфейса Product, в зависимости от конфигурации, например:
…
public static Product createProduct() throws Exception{
return Class.forName(System.getProperty(“productclass”)).newInstance();
}
…
После чего можно запускать JVM:
java –Dproductclass=mypackage.ProductB my.MainClass
Таким образом можно избежать зависимости кода от конкретных реализаций того или иного класса. Однако для того чтобы этого добыться надо следить, чтобы классы которые могут быть подменены таким образом реализовывали один и тот же абстрактный интерфейс. По такому принципу сделан DriverManager.getConnection() в JDBC API.
Singleton
Обеспечивает наличие в системе только одного экземпляра заданного класса, позволяя другим классам получать доступ к этому экземпляру.
В данном случае метод getInstance() является статическим (static), и для его вызова можно обращаться напрямую к классу, без создания его экземпляра:
Singleton my = Singleton.getInstance();
Переменная в которой содержиться единственный экземпляр этого класса является также статической и закрытой. Конструктор у такого класса так же закрытый, чтобы трибуты классы не могли создавать экземпляры этого класса. Экземпляр создаётся только один раз при инициализации класса class loader’ом.
Public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
private static Singleton getInstance(){return instance;}
}
Объекты типа singleton применяются для организации различного рода общедоступной информации – своего рода глобальные справочники. Нарпимер можно сделать некий справочник, где хранить разного рода конфигурационную информацию, доступную всем частям программы. Примером является java.lang.System.getProperties() – который возвращает глобальные свойства для всего процесса виртуальной машины.
Важно отметить, что при показанной реализации (через использование статических полей), создаётся один эеземпляр на один загрузчик классов!, если у вас несколько независымых загрузчиков классов, как например, в случае с несколькими web приложениями задеплоенными под разными web context’ами, будет создано по одному экземпляру для КАЖДОГО контекста. Если необходим строго один эземпляр в такой конфигурации, то следует использовать, например, JNDI контексты, поддерживаемые серверами приложений, которые позволяют гарантировать один эеземпляр не только для одного приложения но и для распределённого (например кластеризованного) приложения.
Дата добавления: 2015-10-24; просмотров: 120 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Гранулярность (granularity) | | | Abstract Factory |