2012-02-04 2 views
0

вот мой problem--разделить экземпляр, но создать новую для каждого нового процесса

У меня есть 4 класса - Starter, базы данных и планировщик и класс Test.

Испытательный класс создаст новый экземпляр стартера (который загружает и запускает весь процесс). Стартер инициализирует классы Планировщик и База данных.

Класс испытаний передает данные стартеру. Starter хранит его в классе HashMap в базе данных. Планировщик читает тот же HashMap из класса базы данных.

Теперь для того, чтобы точно такой же HashMap доступ всех классов на протяжении всей моей Java проекта, у меня есть 2 options-- сделать Hashmap статическую или сделать базу данных по синглтон класс. На данный момент я создал базу данных для одного класса.

problem-- если класс Test делает этот

Starter starterInstance1 = новый стартер();

Стартер стартерInstance2 = новый Стартер();

Как я могу гарантировать, что starterInstance1 и starterInstance2 имеют свой экземпляр класса Database или HashMap?

==========

Просто быть более ясным:

класс Test {

Starter start1 = новый Starter(); // создание 1 экземпляр моего приложения

start1.init(); // это будет инициализировать планировщик и т.д., и сделать "getDatabaseInstance()"

для (INT I = 0; я < 50; я ++) {

start1.sendData ("abc"); // все эти 50 запросов будут отправлены в threadpool, который отправит запрос для хранения в HashMap в классе базы данных. Доступ к HashMap будет осуществляться одновременно с помощью Планировщика и других классов. Я создал класс Singleton Database, чтобы все классы имели доступ к одному экземпляру базы данных.

}

// Аналогично создать другой экземпляр моего приложения

Стартер start2 = новый стартер();

start2.init(); // теперь, если я делаю «getDatabaseInstance()», я получу тот же экземпляр, что и выше. но я хочу отдельную базу данных для этого экземпляра приложения. как мне это достичь?

для (INT I = 0; я < 50; я ++) {

start2.SendData ("ABC");

}

}

+0

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

+0

yes singleton будет иметь только 1 экземпляр. но я этого не хочу. отправной точкой моего приложения является класс Starter. всякий раз, когда создается новый экземпляр моего приложения (т. е. новый Starter()), я хочу, чтобы у него была собственная база данных и собственный планировщик, который будет обращаться к одной и той же базе данных. Создание базы данных одноэлементного класса не является решением здесь bcz, это подразумевает, что каждый новый Starter() будет использовать одну и ту же базу данных. я хочу, чтобы каждый новый Starter() имел свою собственную базу данных – anzaan

ответ

1

Самый общий ответ на ваш вопрос, вероятно, будет просто позволить Starter отслеживать ссылки на свои собственные Database. Конечно, Scheduler придется делать то же самое:

public class Starter { 
    Database db; 
    Starter(Database db) { 
     this.db = db; 
    } 
} 

/* ... */ 

Database db1 = new Database(); 
Starter starter1 = new Starter(db1); 
Scheduler scheduler1 = new Scheduler(db1); 

Database db2 = new Database(); 
Starter starter2 = new Starter(db2); 
Scheduler scheduler2 = new Scheduler(db2); 
+0

да, это один из способов. но мое приложение немного сложнее. Я использую инфраструктуру mina nio для передачи данных по TCP-соединениям. Мне понадобится экземпляр этой базы данных по всему моему приложению. Поэтому я не могу просто передать его каждому классу. Более того, я использую его в SessionHandler на стороне клиента. Я не могу передать экземпляр DB в качестве аргумента конструктора. thnx fr ur предложение btw! – anzaan

+0

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

+0

Я согласен с тобой. Я уверен, что это проблема дизайна. но я уже шея уже и на закрытии даты завершения! будет просто проходить через ThreadLocal. между тем, можно ли предложить шаблон дизайна для этого? – anzaan

Смежные вопросы