ایجاد الگوی Single Tone در زبان ++C

برای اطلاعات بیشتر درباره الگوهای طراحی GOF تکنیک های برنامه نویسی SOLID می توانید به لینک زیر مراجعه کنید!
کلاس Single Tone ژنریک با استفاده از اشاره گرهای هوشمند برای ساخت آبجکتی از یک کلاس با یک نمونه واحد برای صرفه جویی در حافظه مصرفی
12345678910111213141516171819202122232425262728293031323334#ifndef SINGLETON_H #define SINGLETON_H #include <memory> namespace BP { template<typename CL> class SingleTone { protected: SingleTone() = default; // defualt ctor virtual inline ~SingleTone(){ delete instance; } private: static CL* instance; SingleTone(const SingleTone&) = delete; //copy ctor SingleTone(SingleTone&&) = delete ; //move ctor SingleTone& operator=(const SingleTone&) =delete ; // copy oprator assignment SingleTone& operator=(SingleTone&&) =delete ; // move oprator assignment static void destory(CL* my){ delete my ; instance = NULL; } public: std::unique_ptr<CL , decltype(&destory)> factory(){ //lazy instation if(instance == NULL){ instance = new CL(); } return std::unique_ptr<CL , decltype(&destory)>(instance , &destory); } }; template<typename CL> CL* SingleTone<CL>::instance = NULL; } #endif // SINGLETON_H
ونحوه استفاده از کلاس فوق من کلاسی دارم برای ارتباط با پایگاه داده به نام DBProvider که در این کلاس متدی به نامOpenConnection را صدا زدم.
توجه کنید که هر کلاسی که بخواهید را می توانید به حالت single tone ایجاد نمایید.
روش اول فراخوانی
db = SingleTone<DBProvider>::factory ()->OpenConnection ()
روش دوم فراخوانی
db = (*SingleTone<DBProvider>::factory ()).OpenConnection ();
فقط توجه داشته باشید که آبجکتهایی کهsingle tone هستند یک اشاره گر واحد دارند بنابراین در کل برنامه یکسان خواهند بود.
کلاس SingleTone سازگار با کامپایل VisualC++14
12345678910111213141516171819202122#pragma once #include <memory> template<class T> class SingleTone { private: SingleTone() = default; inline ~SingleTone() { destory(m_instance); }; public: SingleTone(const SingleTone&) = delete; //copy ctor SingleTone(SingleTone&&) = delete; //move ctor SingleTone& operator=(const SingleTone&) = delete; // copy oprator assignment SingleTone& operator=(SingleTone&&) = delete; // move oprator assignment static void destory(T* my) { delete my; } static std::unique_ptr<T ,decltype(&destory)>& getUniquePInstance() { static T* m_instance = new T; return std::unique_ptr<T, decltype(&destory)>(std::reference_wrapper<T*>(m_instance), &destory); } };
موفق باشید.