Re[3]: Синглтон, позволяющий создавать полиморфные объекты
От: Андрей Галюзин Украина  
Дата: 02.02.04 14:15
Оценка:
A>>Пусть есть рендер-система, причем на все приложение (например, игру) она должна быть одна, то
A>>есть логично реализовать ее в виде синглтона. Рендер-система — абстрактный класс, от него
A>>наследуются d3d-рендер-система и ogl-рендер-система.
A>>На этапе выполнения должна быть возможнотсь создания по запросу нужной рендер-системы и
A>>гарантии того, что она будет существовать в единственном экземпляре.

O>
O> class CRender
O> {
O> ...
O> };

O> CRender& getD3DRender()
O> {
O>     class D3DRender : public CRender
O>     {
O>        ...
O>     };
O>    static D3DRender obj;
O>    return obj;
O> }

O> CRender& getOGLRender()
O> {
O>     class OGLRender : public CRender
O>     {
O>        ...
O>     };
O>    static OGLRender obj;
O>    return obj
O> }

O>


O> Достоинства — Производные классы анонимные и финальные — хрен отнаследуешься. Я бы назвал это

O> "сильный" синглтон.
O> А призводящие функции можно и друзьями базового класса сделать

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

Что-то вроде этого (не компилировалось и многие детали опущены).
struct RendererCreator
{
  virtual Renderer* create() = 0;
};

// имя лучше выбрать покороче ибо RendererSingleton::instance() выглядит
// несколько громоздко
class RendererSingleton
{
public:
  static set_creator(RendererCreator* value)
  {
     creator_ = value;
  }

  static Renderer& instance()
  {
     if (!instance_)
     {
       if (!creator_)
         throw std::logic_error("null creator");
       instance_ = creator_->create();
     }
     return *instance_;
  }

private:
  ~RendererSingleton();

private:
  static Renderer* instance_;
  static RendererCreator* creator_;
};


--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.