یک توسعه دهنده نرم افزار
ایجاد الگوی Single Tone در زبان ++C
برای اطلاعات بیشتر درباره الگوهای طراحی GOF تکنیک های برنامه نویسی SOLID می توانید به لینک زیر مراجعه کنید!
کلاس Single Tone ژنریک با استفاده از اشاره گرهای هوشمند برای ساخت آبجکتی از یک کلاس با یک نمونه واحد برای صرفه جویی در حافظه مصرفی
#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
#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);
}
};
موفق باشید.
مطلبی دیگر از این انتشارات
معرفی چند آموزشگاه طراحی سایت و بررسی دوره طراحی سایت
مطلبی دیگر از این انتشارات
آموزش ماژول random در پایتون
مطلبی دیگر از این انتشارات
ورود به دنیا ویروس های رایانه ای