SingleTon与Factory的结合

       关于设计模式这个话题大家可能,也许是老话重谈了,很多入门级的程序员也许看过很多关于设计模式的书籍,往往大家都

是给出了简答示例来,接下来我从几个工程场景来谈谈,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是实现类。这样方便快速替换掉自己需要的实现类,接口与实现解耦合。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值