Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактная фабрика 
:(
    Опции темы
BasMan
Дата 18.4.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.7.2005

Репутация: нет
Всего: нет



Сам я потихоньку переезжаю с С++ на Java (1 день ))) ), в С++ у меня был хороший отработанный код фабрики. Где я мог зарегать нужный класс (наследник базового) на лету и потом по ходу дела создавать объекты. 

Вроде такого:

Код
sfactory->registerType<clsFunctorI_sha1>("centurion_math_hashsbase_sha11");


и потом походу делать создавать объект по "текстовому идентификатору"

Код
boost::shared_ptr<clsFunctorInterface> hash_functor=factory->create("centurion_math_hashsbase_sha11");


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

Вопрос, есть ли у кого код фабрики аналогичной по функционалу?
PM MAIL   Вверх
Stolzen
Дата 19.4.2011, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Только это не абстрактная фабрика, а фабричный метод.

Суть в том, что есть map, в которой хранятся классы. При вызове create происходит поиск в хеш контейнере и вызывается конструктор по умолчанию для найденного класса.
Если нужно создавать объекты по прототипу, то нужно сделать map для String, Object и в функции create вызывать метод clone хранящегося объекта. При этом все эти объекты должны реализовывать интерфейс Cloneable. 

Код

import java.util.HashMap;

public class Factory {
    private HashMap<String, Class<?>> map = new HashMap<String, Class<?>>();
    
    public void registerClass(String key, Class<?> cl) {
        map.put(key, cl);
    }
    
    public void registerClass(String key, String className) {
        Class<?> cl = null;
        
        try {
            cl = Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
        map.put(key, cl);
    }
    
    public Object create(String key) {
        Class<?> cl = map.get(key);
        
        Object newObject = null;
        
        try {
            newObject = cl.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return newObject;
    }
    
    
    public static void main(String[] args) {
        Factory f = new Factory();
        
        f.registerClass("centurion_math_hashsbase_sha11", FunctorIsha11.class);
        f.registerClass("centurion_math_hashsbase_md5", FunctorIImd5.class);
        
        FunctorIsha11 sha11 = (FunctorIsha11)f.create("centurion_math_hashsbase_sha11");
        System.out.println(sha11);
    }
}

class FunctorIsha11 {
    public String toString() {
        return "I am a sha11 functor";
    }
}

class FunctorIImd5 {
    public String toString() {
        return "I am a md5 functor";
    }
}


Думаю, идея должна быть понятна.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0413 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.