Вход на сайт
Глобально доступная информация
308 просмотров
Перейти к просмотру всей ветки
Chipolino свой человек
Как наиболее элегантно организовать доступ к данным , которые должны быть глобально доступны ? ( Ахтунг дальше плюсы)
У меня есть несколько фабрик , и мне нужно из многих мест в программе знать, какой объект активен.
Пока вот что придумал :
Имеем небольшую иерархию
У меня есть несколько фабрик , и мне нужно из многих мест в программе знать, какой объект активен.
Пока вот что придумал :
Имеем небольшую иерархию
struct CANDevice
{
virtual ~CANDevice() {}
};
struct CANDevice1:public CANDevice
{
};
struct CANDevice2:public CANDevice
{
};
Фабрика
class CANDeviceFactory
{
public:
typedef CANDevice* (*Creator)();
CANDeviceFactory()
{
registerDevice("device 1" , &createCANDevice<CANDevice1>);
registerDevice("device 1" , &createCANDevice<CANDevice2>);
}
shared_ptr<CANDevice> create(std::string const & id)
{
return shared_ptr<CANDevice>(creators_[id]());
}
void registerDevice(std::string const & id,Creator creator)
{
creators_[id]=creator;
}
private:
std::map<std::string, Creator> creators_;
};
И собственно в функции креаторе регистрируем объект
template<class CANDeviceType>
CANDevice* createCANDevice()
{
CANDevice* device = new CANDeviceType();
Info::current<CANDevice>().set(device); // смотри ниже
return device;
}
И теперь класс Info
template<class T>
class CurrentItem
{
public:
T* get() { return item_;}
void set(T* item) { item_=item; }
private:
T* item_;
};
class Info
{
public:
template<class T>
static CurrentItem<T> & current()
{
static CurrentItem<T> item;
return item;
}
};
Где-нибудь в коде
CANDeviceFactory factory;
factory.create("device 1");
// теперь с любого места в программе
Info::current<CANDevice>().get()
Жду ваших советов :-)