معرفی دیزاین‌ پترن‌های Design Pattern رایج و کاربردی به زبان ساده

معرفی دیزاین‌ پترن‌های Design Pattern رایج و کاربردی به زبان ساده

معرفی دیزاین‌ پترن‌های Design Pattern رایج و کاربردی به زبان ساده

 

دیزاین پترن‌ها، راه‌کارهایی بهینه و با قابلیت استفاده مجدد برای مشکلات برنامه‌ نویسی هستند. الگوهای طراحی در اصل راه حلی برای حل کردن مشکلات برنامه نویسی است، که در مورد اون راه حل، به خوبی فکر شده است. بسیاری از برنامه نویسان با این مشکلات برخورد کردن و راه حل اون مشکلات رو هم پیدا کردن. اگر شما با این مسائل برخورد کنی چرا دوباره راه حلی رو بسازی که قبلا یکی دیگه اون رو ساخته و اثبات کرده!

دیزاین پترن ها سه نوع اصلی دارند

 

ساختاری (structural): این دسته از پترن‌ها این امکان رو به ما میدن که به شکل بهینه‌تری بین ساختارها، متدها، کلاس‌ها و اساسا هر موجودیتی که در زبانمون داریم ارتباط برقرار کنیم.

تکوینی یا ایجادی (creational) : این الگو‌ها همونطوری که از اسمشون هم مشخصه راه‌حل‌هایی رو در ایجاد اقلام مختلف مثل متدها، نمونه‌ها و… برای ما تعریف می‌کنن.

رفتاری (behavioral): الگوهای رفتاری هم به رفتار Entity هامون (موجودیت‌ها شامل کلاس، متد، نمونه، اینترفیس و…) نسبت به مسائل مختلف میپردازن. مسئله میتونه تغییر یک entity دیگه باشه یا میتونه تغییر state داخل خود entity باشه.



 

 معرفی الگوهای ساختاری

Adapter: 

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

 

آداپتور در واقع به شما اجازه می‌دهد اعمالی را در داخل یک کلاس اصطلاحاً Wrap‌ (بسته‌بندی) کنید و این عمل‌ها را در موقعیت‌های مناسبی مورد استفاده قرار دهید. به‌عنوان مثال، به جای فراخوانی کلاس‌های متفاوت و صدا زدن فانکشن‌های آن‌ها به صورت تک‌به‌تک، می‌توانید تمامی این متدها را در یک متد واحد توسط کلاس آداپتور اصطلاحاً Encapsulate کنید.

مثال:

http://alihossein.ir/tutorials/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-adapter-design-pattern



 

Bridge:

 الگوی پل، یک الگوی طراحی در مهندسی نرم‌افزار است که به معنای "جداسازی یک انتزاع از اجرای آن به طوری که این دو بتوانند به صورت مستقل تغییر پذیر باشند."می‌باشد.

مثال:

https://roocket.ir/articles/bridge-pattern

 

Composite: 

از دیزاین پترن Composite جهت ساخت اشیاء به صورت درخت سلسله مراتبی زمانی که قرار است با گروهی از اشیاء رفتار مشابهی انجام داد استفاده میشود. همچنین در کدهایی مثل لیست پیوندی و گراف میتوانیم از دیزاین پترن کامپوزیت استفاده کنیم.

مثال:

https://holosen.net/wp-content/uploads/2020/02/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-Composite-_-%D9%87%D9%88%D9%84%D9%88%D8%B3%D9%86-Holosen.pdf

 

Decorator: 

هدف از پیاده سازی الگوی Decorator اضافه کردن یک وضعیت و یا یک رفتار (Behavior) به یک کلاس بدون تغییر دادن آن می باشد. این عمل می تواند کاملا به صورت داینامیک انجام شود. این دو مشخصه (تغییر نکردن کلاس فعلی و داینامیک بودن)، Decorator را تبدیل به یکی از پرکاربردترین الگوهای طراحی شیء گرا کرده است.

مثال:
http://alihossein.ir/tutorials/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-decorator-design-pattern

 

Facade: 

“فساد” به معنی نمایه خارجی یا بیرونی هست و میشه گفت کارش اینه که پیچیدگی های داخل سیستم رو آسون تر کنه  و جزییات داخلی رو پنهان کنه.

در واقع کلاس فساد ، کلاس های زیر سیستم یا sub class را مدیریت میکنه  و به جای اینکه برنامه نویس در نهایت با همه ی ساب کلاس ها در ارتباط باشه و گیج بشه… تنها با کلاس فساد در ارتباط است و اطلاعات لازم رو به این کلاس میده و خود کلاس کارهای مربوطه رو به ترتیب انجام میده.

مثال:

http://alihossein.ir/tutorials/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-facade-design-pattern

 

Flyweight:

کاربرد و هدف اصلی Flyweight پترن، کاهش تعداد شی‌های ساخته شده در کد است. به طور کلی کاری که این پترن انجام می‌دهد استفاده دوباره از شی‌های که قبلا ساخته شده بوده و اگر شی خاصی وجود نداشت آن را می‌سازد.

مثال:

https://codegate.ir/2017/04/11/flyweight-%D9%BE%D8%AA%D8%B1%D9%86-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7/

 

Proxy: 

توی الگوی پراکسی، یک آبجکت، نمایندهٔ یک آبجکت دیگه برای انجام کارهای اون آبجکت میشه. پس می‌تونیم بگیم که:

یک پراکسی، آبجکتی هست که در نقش یک رابط یا واسط برای یک آبجکت دیگه عمل می‌کنه.

مثال:

https://ditty.ir/posts/proxy-design-pattern/Jq6W5



 

معرفی الگوهای ایجادی

 

 Abstract factory: 

الگوی طراحی Abstract Factory جزو الگوهای طراحی سازنده (Creational) است که برای مدیریت ساخت اشیا توسعه داده شده است. Abstract Factory به شما اجازه می دهد که مجموعه ای از اشیا مرتبط را بدون نیاز به ساخت کلاس های جداگانه و متعدد ایجاد کنید. گاهی اوقات این دیزاین پترن را با نام factory of factory هم می شناسند.

در دیزاین پترن factory گفتیم که به جای اینکه یک شیء از یک کلاس را خودتان با استفاده از دستور new ایجاد کنید، آن را از کارخانه تولید کننده اشیاء دریافت کنید و با آن کار کنید.

در دیزاین پترن abstract factory در حقیقت در یک سطح بالاتر، برای ساخت اشیاء مشابه و هم خانواده که میتوانند در یک کارخانه قرار بگیرند، میتوانیم از این الگو استفاده کنیم.

مثال:

https://virgool.io/@mohammad.ghodsian/java-factory-of-factory-design-pattern-igtbdhpkdffw

 

Builder: 

دیزاین پترن Builder نقش یک سازنده است عمل می کند یعنی مراحل ساخت یک آبجکت را به صورت مرحله به مرحله و با استفاده از یک ترتیب مشخص انجام می دهد .در این تکنیک به جای طراحی تعدادی سازنده ( constructor ) با تعداد زیادی پارامتر از یک شی دیگر استفاده می‌کنیم که کار پارامتردهی را به صورت مرحله به مرحله و خوانا تر انجام می دهد و در نهایت از نوع شی مورد نظر یک نمونه با تنظیمات خواسته شده را به ما تحویل می‌دهد.

مثال:

https://ditty.ir/posts/builder-design-pattern/XEW35

 

Factory method: 

این الگو میگه به جای اینکه خودمون به صورت مستقیم آبجکت‌ها رو بسازیم، کارِ ساختن آبجکت‌ها رو ببریم توی یک متد دیگه. به این متد میگن Factory که توی کلاس اصلی نوشته میشه.

مثال:

https://ditty.ir/posts/factory-method-design-pattern/XldZX

 

Lazy Initialization: 

شیوهٔ تأخیر انداختن برای ساخت یک شئ، محاسبه یک مقدار یا پردازش‌های سنگین دیگر تا زمانِ اولین نیاز به آن‌ها.

 

Multiton: 

 

دیزاین پترن multiton گسترش داده شده ی دیزاین پترن singleton هست و یه جورایی کار دیزاین پترن singleton را بسط می دهد . در واقع این دیزاین پترن (Design Pattern) به ما امکان می دهد تا به تعداد محدود و  مشخصی از یک کلاس بتوان نمونه سازی شود و به عبارتی تعداد اشیایی که می توان از یک کلاس داشت را محدود کرد  و این کار را با اختصاص دادن یک کلید به هر کدام از اون اشیا , انجام می یابد به این صورت که برای هر کلید یک آبجکت ساخته می شود .

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

 

http://alihossein.ir/tutorials/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-multiton-design-pattern



 

Object pool: 

با بازیابی اشیائی که دیگر مورد استفاده قرار نمی‌گیرند از اشغال و آزادسازی‌های سنگین منابع دوری می‌کند.

 

Prototype: 

از این دیزاین پترن به منظور ایجاد یک شی جدید به واسطه کپی (clone) کردن یک شی که قبلا ایجاد شده است استفاده می شود  که به اصطلاح می گویند یک clone از شی گرفته شده است .

 

آبجکت (object) جدید می توانید دقیقا شبیه همان آبجکت یا کلاس اصلی باشد و یا تغییراتی داشته باشد . پس می توان گفت زمانی از دیزاین پترن Prototype استفاده می کنیم که نیاز به یک شی جدید داشته باشیم ولی ایجاد شی از نظر زمانی و یا مصرف منابع (resource) مقرون به صرفه نباشد به همین دلیل از شی قبلیمون یک کپی یا clone میگیریم .

 

مثال:
http://alihossein.ir/tutorials/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-prototype

 

Resource acquisition is initialization: 

این اطمینان را می‌دهد که منابع به‌ طور مناسب با تعیین طول عمر برای اشیاء آزادسازی می‌شوند.

 

Singleton:

 این اطمینان را می‌دهد که یک کلاس دارای تنها یک نمونه بوده و دسترسی به آن نمونه را تدارک می‌بیند.

مثال:
http://alihossein.ir/tutorials/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-singleton-design-pattern

 

Object library: 

کپسوله کردن مدیریت اشیاء شامل factory interface و لیست‌های مُرده و زنده.

 

معرفی الگوهای رفتاری

 

 Chain of responsibility:

یک الگوی رفتاری (behavioral) است که توانایی فراخوانی اشیا را به صورت زنجیره ای به ما می‌دهد در حالی که به هر کدام از اشیا این قابلیت را می‌دهیم تا از اجرای ادامه چرخه جلوگیری کند و یا درخواست را به شی بعدی در زنجیره بفرستد.

سختش نکنیم! ما با استفاده از این دیزاین پترن میتوانیم زنجیره ای از کارها را پشت سر هم انجام دهیم بدون اینکه از بیرون بخواهیم این کارها را جداگانه انجام بدیم.

 

مثال:

https://holosen.net/chain-of-responsibility-design-pattern/

 

Command: 

الگوی طراحی فرمان یک درخواست را به عنوان یک شیء در بر می گیرد و بدین ترتیب به شما امکان می دهد با درخواست های مختلف ، درخواست صف یا ورود به سیستم ، پارامترها را تنظیم کرده و عملیات غیرقابل انجام را پشتیبانی کنید.

سختش نکنیم! وقتی یک سری دستورات داریم که میخوایم یکدفعه با هم انجام بشه همه رو میدیم به یک متدی که اونها رو اجرا کنه.

مثال:

https://holosen.net/command-design-pattern/

 

Interpreter:

الگوی طراحی مترجم یک روشی است برای اینکه بتوانیم مانند یک زبان از قواعد ترجمه در کدهایمان استفاده کنیم.

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

مثال:

https://holosen.net/interpreter-design-pattern/

 

Iterator: 

الگوی طراحی Iterator راهی برای دسترسی پی در پی به عناصر یک شیء مجتمع بدون افشای نمای اصلی آن فراهم می کند.

سختش نکنیم! وقتی بخواهیم اعضای یک کالکشن (مثل لیست) را تک به تک پیمایش کنیم، این دیزاین پترن به کارمان می آید.

مثال:

https://holosen.net/iterator-design-pattern/

 

Mediator: 

الگوی طراحی میانجی (Mediator) یک شی را تعریف می کند که نحوه تعامل مجموعه ای از اشیاء را در بر می گیرد و کپسوله سازی میکند. loose coupling را با جداسازی اتصال بین اشیا ترویج میدهد.

سختش نکنیم! وقتی بخواهیم به در بگیم تا دیوار بشنوه از این روش استفاده میکنیم.

مثال:

https://holosen.net/mediator-design-pattern/

 

Memento: 

الگوی طراحی Memento بدون نقض انکپسولیشن، حالت داخلی یک شی را ضبط و برون سازی می کند تا بتواند بعداً به این حالت بازگردد.

سختش نکنیم! تابحال به عملکرد Undo دقت کردید؟ هر وقت بخوایم میتونیم یک مرحله کارمون رو به عقب برگردانیم. این دقیقا همین دیزاین پترنه! هر وقت میخوای وضعیت هایی رو نگهداری کنی که هر وقت خواستی بتونی به عقب برگردی (نه صرفا یکی یکی عقب بری، هر وضعیتی که خواستی میتونی بری) از این دیزاین پترن استفاده میکنیم.

مثال:

https://holosen.net/memento-design-pattern/

 

Observer: 

الگوی طراحی Observer وابستگی یک به چند بین اشیا را تعریف می کند به طوری که وقتی یک شیء حالت خود را تغییر می دهد ، همه وابستگان آن به طور خودکار مطلع و به روز می شوند.

مثال:

https://holosen.net/observer-design-pattern/

 

State:

الگوی طراحی State به یک شی اجازه می دهد تا رفتار خود را هنگام تغییر وضعیت داخلی تغییر دهد. به نظر می رسد که شی کلاس خود را تغییر می دهد.

سختش نکنیم! هر وقت میخوایم رفتار کلاس رو وقتی که مثلا یک فیلد را مقدارش را عوض میکنیم، تغییر بدهیم از این دیزاین پترن استفاده میکنیم.

مثال:

https://holosen.net/state-design-pattern/

 

Strategy: 

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

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

مثال:

https://holosen.net/strategy-design-pattern/



 

Template method:

الگوی طراحی Template اسکلت یک الگوریتم را در یک عملیات تعریف می کند و برخی مراحل را به زیر کلاس ها موکول می کند. این الگو به خرده کلاس ها اجازه می دهد تا مراحل خاصی از یک الگوریتم را بدون تغییر در ساختار الگوریتم بازتعریف کنند.

سختش نکنیم! هروقت یک اسکلت برای کدمون بخوایم داشته باشیم تا همه کدها مطابق با اون اسکلت پیش برن از این دیزاین پترن استفاده میکنیم.

مثال:

https://holosen.net/template-design-pattern/

 

Visitor: 

عملی که بایستی بر روی عناصر یک ساختار از اشیاء اعمال شود را نمایش می‌دهد. این الگو اجازه می‌دهد تا عمل جدیدی بدون نیاز به تغییر کلاس‌های عناصری که بر روی آن عمل می‌کند را تعریف کنید.

مثال:

https://holosen.net/visitor-design-pattern/

 

Repository:

الگوی ریپازیتوری پیشنهاد می کند که یک لایه واسط بین لایه منطق-بیزینس و لایه دسترسی وجود داشته باشد.

لایه ریپازیتوری نحوه دسترسی با پایگاه داده را از لایه های بالایی برنامه نویسی پنهان می کند در واقع لایه ای است که پیچیدگی های کوئری ها در آن قرار می گیرد و به ما کمک می کند تا یک کد تمیز و خوانا تولید کنیم در این الگو برای هر شی نیاز می باشد یک ریپازیتوری ساخته شود.

 

مثال:

https://virgool.io/@sina.it91/%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%85%D8%AE%D8%B2%D9%86-repository-design-pattern-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-tueuub07nzfm

 

https://roocket.ir/articles/repository-design-pattern-in-laravel

نویسنده :
مجید پورداود
  • مجید پورداود
  • مهندس نرم افزار و تحلیلگر ارشد سیستم های کامپیوتری تحت وب می باشم. از سال 1395 برنامه نویسی را شروع کردم و به زبان های php (فریم ورک laravel -codeigniter)  و زبان جاوا اسکریپت (فریم ورک express.js-nest.js)  تسلط دارم.  

ثبت دیدگاه جدید

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *