فهرست مطالب:

نحوه انجام الگوی طراحی Singleton در C ++: 9 مرحله
نحوه انجام الگوی طراحی Singleton در C ++: 9 مرحله

تصویری: نحوه انجام الگوی طراحی Singleton در C ++: 9 مرحله

تصویری: نحوه انجام الگوی طراحی Singleton در C ++: 9 مرحله
تصویری: الگوی طراحی Singleton 2024, نوامبر
Anonim
نحوه انجام الگوی طراحی Singleton در C ++
نحوه انجام الگوی طراحی Singleton در C ++

معرفی:

هدف از این راهنمای آموزشی این است که به کاربر نحوه پیاده سازی الگوی طراحی تک نفره در برنامه C ++ خود را آموزش دهد. با این کار ، این مجموعه دستورالعمل همچنین به خواننده توضیح می دهد که چرا عناصر یک تک نفره به این شکل هستند و چگونه کد پردازش می شود. دانستن این موضوع ، در آینده با اشکال زدایی تک آهنگ های آینده شما کمک می کند. الگوی طراحی تک نفره چیست؟ الگوی طراحی تک نفره یک الگوی طراحی است که در آن کد نویسی کلاسی را ایجاد می کند که فقط یک بار می توان آن را مثال زد ، به وظایف عمومی کلاس ها می توان در هر جایی دسترسی داشت ، مشروط بر اینکه فایل هدر را در سایر فایل های مربوط به پروژه #وارد کرده باشید.

الگوی طراحی تک نفره الگوی طراحی ضروری برای هر برنامه نویس شی گرا ، برنامه نویسان نرم افزار و برنامه نویسان بازی است. الگوی طراحی تک نفره نیز یکی از ساده ترین الگوهای طراحی کدگذاری موجود است. یادگیری آن می تواند به شما در یادگیری سایر الگوهای طراحی دشوارتر در آینده کمک کند. همچنین می تواند به شما کمک کند تا کد برنامه خود را به گونه ای ساده کنید که فکر نمی کردید امکان پذیر باشد.

در حالی که دشواری الگوی طراحی تک نفره در مقایسه با سایر الگوهای طراحی آسان است ، این مجموعه دستورالعمل دارای مشکل متوسط است. این بدان معناست که برای انجام این دستورالعمل ها ، توصیه می کنیم نیازهای اولیه و نحوی C ++ را بدانید. همچنین باید آداب کدنویسی C ++ مناسب را بدانید (یعنی متغیرهای کلاس را خصوصی نگه دارید ، یک کلاس در هر فایل هدر و غیره). همچنین باید نحوه آزادسازی حافظه و نحوه عملکرد سازنده ها و مخرب کننده ها در C ++ را بدانید.

این راهنمای آموزشی به طور متوسط حدود 10-15 دقیقه طول خواهد کشید.

مواد مورد نیاز:

-یک رایانه (می تواند رایانه شخصی یا Mac باشد) که می تواند Visual Studios (در هر نسخه) را اجرا کند

یک برنامه ساده ، ایجاد شده در Visual Studios ، که می توانید تک نفره خود را با آن آزمایش کنید

توجه: الگوی طراحی تک نفره را می توان در هر IDE یا رابط برنامه نویسی پشتیبانی کننده C ++ انجام داد ، اما برای این مجموعه دستورالعمل ، از Visual Studios Enterprise Edition استفاده می کنیم.

مرحله 1: کلاس خود را با فایل Header و فایل CPP ایجاد کنید

کلاس خود را با فایل سربرگ و فایل CPP ایجاد کنید
کلاس خود را با فایل سربرگ و فایل CPP ایجاد کنید
کلاس خود را با فایل Header و فایل CPP ایجاد کنید
کلاس خود را با فایل Header و فایل CPP ایجاد کنید

برای ایجاد این دو فایل و کلاس به طور همزمان ، پروژه / برنامه خود را در Visual Studios باز کنید ، به Explorer راه حل بروید ، راست کلیک کرده و یک کادر باید در نزدیک مکان نما ماوس شما ظاهر شود ، گزینه "Add" را بیابید ، شناور را پیدا کنید روی آن ، و یک کادر دیگر باید در سمت راست ظاهر شود. در این کادر ، می خواهید گزینه "Item New.." را بیابید ، روی آن کلیک کنید و یک پنجره ، شبیه تصویر 1.1 عکس زیر ، ظاهر می شود. در این پنجره می خواهید "C ++ Class" را انتخاب کرده و سپس "Add" را فشار دهید. با این کار پنجره دیگری باز می شود که شبیه عکس 1.2 است. در این پنجره ، نام کلاس خود را در قسمت "Name Class" تایپ می کنید و Visual Studios به طور خودکار فایل واقعی را پس از نام کلاس نامگذاری می کند. به منظور این دستورالعمل ، ما قصد داریم کلاس خود را "EngineDebugSingleton" نامگذاری کنیم ، اما می تواند هر نام مبتنی بر حروف باشد. اکنون می توانید "OK" را فشار داده و به مرحله 2 بروید.

توجه: راه حل اکسپلورر و محل نگهداری فایل ها در رایانه شما جدا هستند. جابجایی یا ایجاد هر چیزی در راه حل اکسپلورر باعث جابجایی و سازماندهی فایل های درون فایل اکسپلورر سیستم عامل شما نمی شود. یک راه امن برای سازماندهی فایل های خود در سمت فایل اکسپلورر حذف ، اما حذف فایل های خاص از explorer solution نیست ، انتقال همان فایل ها در فایل اکسپلورر به محل مورد نظر و بازگشت به راه حل Explorer ، راست کلیک ، گزینه "Add" را پیدا کنید ، سپس "Itisting Item" را پیدا کرده و فایل هایی را که منتقل کرده اید پیدا کنید. مطمئن شوید که هم سربرگ و هم فایل cpp را منتقل کرده اید.

مرحله 2: سازنده را روی Private تنظیم کنید

Constructor را روی Private قرار دهید
Constructor را روی Private قرار دهید

با فایل CPP و سربرگ تازه ایجاد شده خود ، اگر هنگام ایجاد به طور خودکار باز نشد ، به Explorer راه حل بروید و "EngineDebugSingleton.h" را کلیک کرده و باز کنید. سپس با "EngineDebugSingleton ()" ، سازنده پیش فرض کلاس و "D EngineDebugSingleton ()" تخریب کننده کلاس استقبال می شوید. برای این مرحله ، ما می خواهیم سازنده را روی خصوصی تنظیم کنیم ، این بدان معناست که این تابع فقط برای کلاس در دسترس است و هیچ چیز دیگری. با این کار ، شما نمی توانید یک متغیر ایجاد کنید یا کلاس را به حافظه خارج از کلاس اختصاص دهید ، فقط در فایل سربرگ کلاسها و سایر توابع کلاسها. داشتن خصوصی سازنده کلید الگوی طراحی و نحوه عملکرد تک نفره ها است. در مراحل بعدی خواهیم فهمید که چگونه یک تک نفره به صورت لحظه ای و دسترسی پیدا می کند.

پس از انتقال سازنده به حالت خصوصی ، کلاس باید به این شکل باشد (به عکس مربوطه نگاه کنید)

مرحله 3: Destructor را روی Private قرار دهید

Destructor را روی Private قرار دهید
Destructor را روی Private قرار دهید

همانطور که با سازنده در انجام دادیم

مرحله 2 ، برای این مرحله ، اکنون تخریب کننده را روی خصوصی تنظیم می کنیم. مانند سازنده ، هیچ چیز ، به جز خود کلاس ، قادر به حذف هر گونه متغیر کلاس از حافظه نخواهد بود.

پس از اتمام این مرحله ، کلاس اکنون باید به این شکل باشد. (به عکس مربوطه مراجعه کنید)

مرحله 4: ایجاد یک متغیر اشاره گر استاتیک در Singleton

ایجاد متغیر اشاره گر استاتیک در Singleton
ایجاد متغیر اشاره گر استاتیک در Singleton

در این مرحله ، یک a ایجاد می کنیم

متغیر اشاره گر ایستا از نوع "EngineDebugSingleton*". این متغیری است که برای تخصیص سینگلتون ما به حافظه مورد استفاده قرار می گیرد و در تمام مدت زمانی که تک تک ما به حافظه اختصاص داده می شود ، به آن اشاره می کند.

فایل هدر ما پس از ایجاد این متغیر باید به این شکل باشد

مرحله 5: ایجاد یک تابع نمونه

ایجاد یک تابع نمونه
ایجاد یک تابع نمونه

اکنون می خواهیم نمونه ای بسازیم

عملکرد. تابع باید یک تابع ثابت باشد و بخواهد یک مرجع به کلاس ما بازگرداند ("EngineDebugSingleton &"). ما تابع خود را Instance () فراخوانی کردیم. در خود تابع ، ما می خواهیم ابتدا آزمایش کنیم که آیا ptrInstance == nullptr (می توان آن را کوتاه کرد! می خواهید با انجام ptrInstance = new EngineDebugSingleton () تخصیص دهید. این جایی است که شما در واقع تکی را به حافظه اختصاص می دهید. پس از خروج از محدوده عبارت if ، آنچه را ptrInstance به آن اشاره می کند ، که با نحو "*ptrInstance" نشان داده می شود ، برمی گردانیم. ما هنگام ایجاد توابع عمومی استاتیک خود از این تابع به شدت استفاده خواهیم کرد ، بنابراین می توانیم بررسی کنیم که آیا تک آهنگ ایجاد شده و به حافظه اختصاص داده شده است یا خیر. در اصل ، این تابع باعث می شود تا بتوانید فقط یک تخصیص از کلاس داشته باشید و نه بیشتر.

این چیزی است که کلاس ما پس از ایجاد تابع Instance () باید در حال حاضر باشد. همانطور که می بینید ، تمام کارهایی که انجام داده ایم در بخش خصوصی کلاس باقی مانده است ، در مراحل بعدی کمی تغییر خواهد کرد.

مرحله 6: ایجاد توابع عمومی استاتیک

ایجاد توابع عمومی استاتیک
ایجاد توابع عمومی استاتیک
ایجاد توابع عمومی استاتیک
ایجاد توابع عمومی استاتیک
ایجاد توابع عمومی استاتیک
ایجاد توابع عمومی استاتیک

بعد از اینکه عملکرد را از

در مرحله 5 ، می توانید شروع به ایجاد توابع عمومی ثابت کنید. هر تابع عمومی باید دارای یک تابع خصوصی باشد تا بتوان با آن کار کرد ، نام این تابع نمی تواند یکسان باشد. چرا تابع را استاتیک می کنیم؟ ما توابع عمومی را ثابت می کنیم تا بتوان بدون شیء واقعی به آنها دسترسی داشت. بنابراین به جای انجام کاری مانند "EngineDebugSingleObj-> SomeFunction ()" ، "EngineDebugSingleton:: Some Function ()" را انجام می دهیم. این امر به شما امکان می دهد به طور کلی در هر جایی از کد به یک فرد مجرد دسترسی داشته باشید ، مشروط بر اینکه فایل هدر را در فایل پروژه خاصی که با آن کار می کنید #گنجانده باشید. با این کار ، می توانید تک نفره را از طریق هر یک از عملکردهای عمومی آن ایجاد کنید.

برای اهداف خود در این مرحله ، ما دو تابع خالی استاتیک عمومی ، "add ()" و "subtract ()" ایجاد کردیم. در بخش خصوصی ، ما دو تابع دیگر ، "PrivAdd ()" و "PrivSubtract ()" داریم. ما همچنین یک متغیر int به نام "NumberOfThings" اضافه کردیم. تعریف این توابع در فایل CPP کلاسهای ما قرار می گیرد. برای اینکه بتوانید به راحتی تابع را وارد فایل CPP کنید ، با نشانگر خود ، تابع را که باید خط سبز زیر آن باشد ، برجسته کرده و "Left ALT + ENTER" را فشار دهید ، به شما این امکان را می دهد که تعریف را در فایل CPP مربوط به کلاس ها عکس 6.1 را ببینید تا ببینید فایل سرصفحه چگونه باید باشد و پس از ایجاد همه تعاریف تابع ، CPP شما باید مانند عکس 6.2 باشد با این تفاوت که تعاریف عملکرد شما فاقد کد در آنها است.

اکنون می خواهید همان کد عکس 6.2 را به تعاریف عملکرد خود اضافه کنید. همانطور که قبلاً گفته شد ، توابع عمومی ما از تابع Instance () استفاده خواهند کرد ، که آنچه ptrInstance به آن اشاره می کند را باز می گرداند. این به ما اجازه می دهد تا به توابع خصوصی کلاس خود دسترسی پیدا کنیم. با هر عملکرد عمومی تک نفره ، فقط باید آن تابع Instance را فراخوانی کنید. تنها استثنا در این مورد ، عملکرد Terminate ما است.

توجه: توابع عمومی و خصوصی دقیق نشان داده شده در این مرحله ضروری نیستند ، شما می توانید نام و عملکردهای متفاوتی در عملکرد خصوصی داشته باشید ، اما برای هر نوع عملکرد عمومی ، باید یک تابع خصوصی داشته باشید و در مورد ما تابع عمومی همیشه باید از تابع Instance () استفاده کند.

مرحله 7: ایجاد تابع Terminate

ایجاد تابع Terminate
ایجاد تابع Terminate
ایجاد تابع Terminate
ایجاد تابع Terminate

از آنجا که ما فقط می توانیم تک نفره خود را از حافظه در کلاس خود تخصیص دهیم ، باید یک تابع عمومی ثابت ایجاد کنیم. این تابع با حذف در ptrInstance ، که کلاس را مخرب می نامد ، فراخوانی می کند و سپس می خواهیم ptrInstance را به nullptr برگردانیم تا در صورت به پایان نرسیدن برنامه ، مجدداً تخصیص داده شود. همچنین می خواهید Singletons خود را خاتمه دهید تا حافظه اختصاص داده شده ای را که در متغیرهای خصوصی Singleton اختصاص داده اید پاک کند.

مرحله 8: تنظیم PtrInstance به Nullptr

تنظیم PtrInstance روی Nullptr
تنظیم PtrInstance روی Nullptr

برای تکمیل تک آهنگ خود ، می خواهید به فایل EngineDebugSingleton. CPP بروید و در بالای فایل CPP ، در مثال ما ، "EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr" را تایپ کنید.

با انجام این کار ابتدا ptrInstance را روی nullptr قرار می دهد ، بنابراین هنگامی که برای اولین بار از تابع نمونه استفاده می کنید ، کلاس ما مجاز به اختصاص حافظه است. بدون آن ، به احتمال زیاد خطایی دریافت خواهید کرد زیرا سعی می کنید به حافظه ای دسترسی داشته باشید که هیچ چیزی به آن اختصاص داده نشده است.

مرحله 9: آزمایش و نتیجه گیری

آزمون و نتیجه گیری
آزمون و نتیجه گیری

ما اکنون می خواهیم تست کنیم که تک نفره ما از عملکرد آن اطمینان حاصل کند ، این شامل ما می شود که توابع عمومی را مانند آنچه در مرحله 6 توضیح داده شده فراخوانی کنیم و ما توصیه می کنیم که نقاط شکست را تنظیم کنید تا از طریق کد خود قدم بگذارید و ببینید که تک نفره به عنوان باید باشد. نقطه شروع ما در main.cpp پروژه ما خواهد بود و main.cpp ما اکنون شبیه تصویر زیر است.

تبریک می گویم! شما به تازگی اولین اجرای الگوی طراحی Singleton را تکمیل کرده اید. با این الگوی طراحی ، اکنون می توانید کد خود را به روش های مختلف ساده کنید. به عنوان مثال ، اکنون می توانید سیستم های مدیریتی ایجاد کنید که در طول زمان اجرای برنامه شما کار می کنند ، که می توان از طریق توابع استاتیک در هر مکانی که کلاس را در آن قرار داده اید به آنها دسترسی پیدا کنید.

فایل هدر نهایی شما باید مانند عکس 7.1 باشد. فایل CPP مربوط به Singleton شما باید مانند عکس 6.2 باشد و در بالای فایل کد نشان داده شده در مرحله 8. در این دستورالعمل ساختار ساده ای از الگوی طراحی Singleton ارائه شده است.

مشاوره عیب یابی:

خطاهای مربوط به حافظه دریافت می کنید؟

مطمئن شوید که به مرحله 7 و مرحله 8 مراجعه می کنید تا مطمئن شوید که ptrInstance را روی nullptr تنظیم کرده اید.

حلقه بی نهایت در حال وقوع است؟

از عملکردهای عمومی اطمینان حاصل کنید ، در تعاریف آنها ، شما تابع خصوصی را فرا می خوانید ، نه همان تابع عمومی.

اشیاء اختصاص داده شده در داخل singleton باعث نشت حافظه می شوند؟

اطمینان حاصل کنید که در صورت نیاز در کد برنامه خود ، تابع پایانی singleton خود را فراخوانی می کنید ، و در تخریب کننده singleton خود ، هرگونه اشیایی را که در محدوده کد تک نفره به حافظه اختصاص داده شده است ، حذف کنید.