ARCEmu项目wow私服服务器网络模块分析(三)

看过network代码的筒子,会发现类定义的时候,经常出现一个Singleton。


为啥要单例啊,这让我们苦比的中国人情何以堪。


Singleton定义如下:

template < class type > class SERVER_DECL Singleton
{
	public:
		/// Constructor
		Singleton()
		{
			/// If you hit this assert, this singleton already exists -- you can't create another one!
			ASSERT(this->mSingleton == 0);
			this->mSingleton = static_cast<type*>(this);
		}
		/// Destructor
		virtual ~Singleton()
		{
			this->mSingleton = 0;
		}

		ARCEMU_INLINE static type & getSingleton() { ASSERT(mSingleton); return *mSingleton; }
		ARCEMU_INLINE static type* getSingletonPtr() { return mSingleton; }

	protected:

		/// Singleton pointer, must be set to 0 prior to creating the object
		static type* mSingleton;
};


人们常说知道设计模式,但不能滥用设计模式啊。


不过这里单例用的,恰到好处,不愧是10年磨一剑。


来看看单例的所到之处:


class SERVER_DECL SocketMgr : public Singleton<SocketMgr>
{
	public:
		SocketMgr();
		~SocketMgr();

		ARCEMU_INLINE HANDLE GetCompletionPort() { return m_completionPort; }
		void SpawnWorkerThreads();
		void CloseAll();
		void ShowStatus();
		void AddSocket(Socket* s)
		{
			socketLock.Acquire();
			_sockets.insert(s);
			++socket_count;
			socketLock.Release();
		}

		void RemoveSocket(Socket* s)
		{
			socketLock.Acquire();
			_sockets.erase(s);
			--socket_count;
			socketLock.Release();
		}

		void ShutdownThreads();
		long threadcount;

	private:
		HANDLE m_completionPort;
		set<Socket*> _sockets;
		Mutex socketLock;
		Arcemu::Threading::AtomicCounter socket_count;
};

这些代码看起来真舒服啊。


设计模式,依据项目环境,而是不因为设计而设计,论语有“过犹不及”。


继续下篇吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值