Лучший шаблон для создания глобальных объектов в Java - PullRequest
3 голосов
/ 06 декабря 2011

Мое приложение требует доступа к определенным объектам по всему приложению. Эти объекты заполняются через БД.

Я хотел бы заполнить объекты при запуске сервера, а затем в приложении по необходимости.

Каков наилучший шаблон для реализации этого, я читал о шаблоне Registry, но не уверен, что это именно то, чего я хочу.

Я также использую Spring 3.x в своем приложении, есть ли что-то в Spring, что может мне помочь?

Ответы [ 5 ]

3 голосов
/ 06 декабря 2011

Вы уверены, что ваше приложение действительно требует этого?

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

Если вам нужно много таких объектов, вы можете обернуть их всех в один класс держателей, который вы добавляете по мере необходимости.

3 голосов
/ 06 декабря 2011

Так как вы говорите, что используете Spring. Лучшее решение - использовать FactoryBean . Этот класс позволяет вам создать бин любого типа и вернуть его в контекст Spring. Spring будет управлять этим bean-компонентом и выставлять его другим bean-компонентам, делая его одноэлементным. Пример:

public class MyObjectFooFactoryBean extends SimpleJdbcDaoSupport implements FactoryBean<ObjectFoo> {
    private String query;

    @Override
    public String getObject() throws Exception {
        return an ObjectFoo here using SimpleJdbSupport (Because I also extended SimpleJdbcDaoSupport)
    }

    @Override
    public Class<?> getObjectType() {
        return ObjectFoo.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

Выше две вещи. 1) Расширяет SimpleJdbcSupport, что позволяет вам иметь доступ к базе данных, и 2) Реализует FactoryBean, которая возвращает объект в контекст Spring. После этого вы можете @Autowire или использовать его в XML-файле.

2 голосов
/ 06 декабря 2011

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

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

1 голос
/ 06 декабря 2011

Это может немного усложниться, если ваше приложение развернуто на нескольких серверах (у каждого из которых есть своя виртуальная машина, поэтому использование одиночных столбцов в виде статических полей будет грязным, а наличие атрибутов на основе контекста не будет работать, если для серверов не установлено значениетиражировать и это ненадежно).Я бы рекомендовал вместо этого использовать таблицу памяти базы данных или какой-либо другой тип серверно-независимого кэша памяти.(http://memcached.org/ например)

1 голос
/ 06 декабря 2011

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

...