关于设计模式这个话题大家可能,也许是老话重谈了,很多入门级的程序员也许看过很多关于设计模式的书籍,往往大家都
是给出了简答示例来,接下来我从几个工程场景来谈谈,Singleton 的实现手段。
(1)入门级别
class DemoSingleTon
{
public:
static DemoSingleTon* getInstance()
{
if (m_psInstnace)
{
return m_psInstnace;
}
else
{
return new DemoSingleTon();
}
}
void TestFunc()
{
}
~DemoSingleTon()
{
if (m_psInstnace)
delete m_psInstnace;
}
private:
DemoSingleTon()
{
}
static DemoSingleTon *m_psInstnace;
};
相信大部分人都可以写出这样一个单件模式模式,但是够了吗?非也,有一定开发经验的程序员可能会马上意识
到这种写法会带来构造线程安全问题,对! 如何解决呢?对加锁,很多人会迅速想到这个解决方法,接下来就会
演进出双检查锁方法。
class DemoSingleTon
{
public:
static DemoSingleTon* getInstance()
{
if (!m_psInstnace)
{
Guard guard(mutex);
if (m_psInstnace == NULL)
{
m_psInstnace = new DemoSingleTon();
}
}
return m_psInstnace;
}
void TestFunc()
{
}
~DemoSingleTon()
{
if (m_psInstnace)
delete m_psInstnace;
}
private:
DemoSingleTon()
{
}
static DemoSingleTon *m_psInstnace;
Mutex mutex;
};
以上的话题也许很多博客都是对单件的,常用使用方式,现在我给出一种Factory模式和SingleTon模式的结合
使用,这种使用方式的优势就是即结合了Factory的屏蔽实现,又可以完成对SingleTon的实现。
class DemoSingleTonImpl : public DemoSingleTon
{
public:
DemoSingleTonImpl()
{
}
void TestFunc()
{
}
};
class DemoSingleTon
{
public:
virtual void TestFunc() = 0;
~DemoSingleTon()
{
if (m_psInstnace)
delete m_psInstnace;
}
static DemoSingleTon* DemoSingleTon::getInstance()
{
if (!m_psInstnace)
{
Guard guard(mutex);
if (m_psInstnace == NULL)
{
m_psInstnace = new DemoSingleTonImpl();
}
}
return m_psInstnace;
}
private:
DemoSingleTon()
{
}
static DemoSingleTon *m_psInstnace;
Mutex mutex;
};
以上方式特点,将业务功能抽象出来,getInstance只是可以替换成需要创建单件类型,示例中是DemoSingleTonImpl是实现类。这样方便快速替换掉自己需要的实现类,接口与实现解耦合。