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"