
الگوی طراحی Singleton در سی پلاس پلاس
سلام دوستان
امیدوارم حال همتون خوب باشه 🙂
قصد دارم الگوی singleton رو به شما آموزش بدم. اول بررسی کنیم که singleton چیه و چه کاربردی داره! گاهی اوقات ما لازم داریم از یک کلاس فقط یک نمونه بسازیم و از ساختن دو یا چند نمونه از class جلوگیری کنیم. اینجاست که الگوی singleton به کار میاد. درواقع این الگو بهمون این اطمینان میده که از ساخته شدن بیشتر از یک شئ جدید از کلاس جلوگیری بشه.
شکل فوق: شکل کلاس دیاگرام الگوی singleton
خب بریم سراغ پیاده سازی براساس کلاس دیاگرام. ابتدا یک کلاس ایجاد می کنیم و متغیر ها و متدها و سازنده ها رو می نویسیم، حوزه دسترسی متد سازنده رو خصوصی می کنیم و یک متغیر از نوع خود کلاس ایجاد می کنیم و اشاره گر رو به سمتش هدف میگیریم و میدان دیدشم خصوصی میکنیم و یک رفتار از نوع خود کلاس همراه با اشاره گره مینوسیم، کلمه کلیدی “static” بیانگر اینه که شما میتونید بدون ساختن نمونه به اون متغیر یا رفتار مورد نظر دسترسی داشته باشیم خوب اینم کد طبق توضیحاتی که دادیم
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> using namespace std; class Singleton{ public: static Singleton *getInstance(); void print(); private: Singleton(){}; static Singleton *instance; }; |
حالا میایم رفتارهاشو پیاده سازی میکنیم ابتدا باید بررسی کنیم ایا متغییر که از نوع کلاس نوشیم به جای اشاره داره یا نه. اگه به جای اشاره نداشت یک نمونه بسازیم در داخل خود کلاس
1 2 3 4 5 | static Singleton *getInstance(){ if(instance==NULL) instance=new Singleton(); return instance; } |
کد کاملش به این صورته
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> using namespace std; class Singleton{ public: static Singleton *getInstance(){ if(instance==NULL) instance=new Singleton(); return instance; } void print(); private: Singleton(){}; static Singleton *instance; }; |
میریم به سراغ تابع main
خوب در قدم اول میریم متغییر که از خود کلاس نوشتیم بصورت عمومی مورد هدف قرار میدم و مقدار آن را Null میذاریم بیرون از تابع Main مینویسیم
1 | Singleton *Singleton::instance=NULL; |
حالا وقت نمونه ساختنه در تابع Main
ابتدا یک نمونه که حالت اشار گر به خودش داره مینوسیم و مقدار اون رو برابر متدی که در کلاس singleton وجود داره میذاریم اگه اینکارو انجام ندیم بصورت خودار کامپایلر جلوگیری میکنه و در آخر میتونیم این متغیر به نمونه های جدید بدهیم ولی همشون به یکه نقطه از حافظه دسترسی دارن
1 | Singleton *p=Singleton::getInstance(); |
خوووووووووووووووووووووووووووب در آخر اینم کدش
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <iostream> using namespace std; class Singleton{ public: static Singleton *getInstance(){ if(instance==NULL) instance=new Singleton(); return instance; } void print(); private: Singleton(){}; static Singleton *instance; }; Singleton *Singleton::instance=NULL; void Singleton::print(){ cout<<instance<<endl; } int main(int argc, char *argv[]) { Singleton *p=Singleton::getInstance(); Singleton::getInstance()->print(); p->print(); Singleton s1(*p); s1.print(); Singleton s2=s1; s2.print(); return 0; } |
در نهایت خروجی برنامه