دوره های آموزشی سایت دانشجویار

آموزش Design Pattern و پرسش‏های متداول – بخش اول

1 vote, average: 1٫00 out of 51 vote, average: 1٫00 out of 51 vote, average: 1٫00 out of 51 vote, average: 1٫00 out of 51 vote, average: 1٫00 out of 5( 1٫00 از 1 رای )
Loading...
آموزش Design Pattern

آموزش Design Pattern و پرسش‏های متداول – بخش اول آموزش Design Pattern که سعی کردیم پرسش هایی در این خصوص را با ذکر مثال مرتبط پاسخ بدیم.همراه ما باشید.

در اینجا یک سری پرسش‏ های متداول سریع و کوچک در رابطه با آموزش Design Pattern در قالب پرسش و پاسخ آورده شده است.بهترین روش برای یادگیری آموزش Design Pattern انجام یک پروژه است.

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

پرسش‏ های متداول آموزش Design Pattern

Design Pattern کدام است؟

  • ممکن است الگوی کارخانه (factory pattern) را توضیح دهید؟
  • ممکن است الگوی کارخانه‏ ی انتزاعی (abstract factory pattern) را توضیح دهید؟
  • ممکن است الگوی سازنده (builder pattern) را توضیح دهید؟
  • ممکن است الگوی نمونه‏ ی اولیه (prototype pattern) را توضیح دهید؟
  • ممکن است کپی سطحی و کپی عمیق در الگوی نمونه ‏ی اولیه را توضیح دهید؟
  • ممکن است الگوی یگانه/سینگلتون (singleton pattern) را توضیح دهید؟
  • ممکن است الگوهای فرمان (command patterns) را توضیح دهید؟
  • آموزش Design Pattern به همراه یک پروژه

آموزش Design pattern

Design Pattern ،  راه حل‏ های امتحان و آزموده شده ‏ی مستند برای مسائل تکراری در یک زمینه‏ ی مشخص هستند.

بنابراین اساسا شما در زمین ه‏ای مسئله داشته ، و راه حل ارائه شده برای آن را در اختیار دارید.

Design Pattern در برخی یا دیگر حالات درست از مرحله‏ ی ابتدایی توسعه‏ ی نرم ‏افزار وجود داشت.

بگذارید اینطور بگوییم که اگر بخواهید یک الگوریتم مرتب سازی را پیاده سازی کنید اولین چیزی که به ذهن خطور می‏کند ،مرتب سازی حبابی است.

بنابراین مسئله مرتب سازی و راه حل مرتب سازی حبابی است. برای الگوهای طراحی نیز به همین صورت است.

سه دسته ‏ی اصلی Design Pattern کدام است؟

سه طبقه بندی اصلی و پایه برای الگوها وجود دارد. الگوهای آفرینشی (Creational)، ساختاری (Structural)، و رفتاری (Behavioral).

الگوهای آفرینشی

  •  کارخانه ‏ی انتزاعی (Abstract Factory):- یک نمونه از چندین خانواده از کلاس‏ها ایجاد می‏کند.
  •  سازنده (Builder): ساخت شیء را از نمایش آن جدا می‏کند.
  •  متد کارخانه (Factory Method): یک نمونه از چندین کلاس مشتق شده ایجاد می‏کند.
  •  نمونه ‏ی اولیه (Prototype): یک نمونه‏ ی مقداردهی اولیه شده بطور کامل جهت کپی یا شبیه سازی شدن.
  •  سینگلتون (Singleton): کلاسی که در آن تنها یک تک نمونه می‏تواند وجود داشته باشد.

تذکر: بهترین راه برای به خاطر سپردن الگوی آفرینشی به خاطر سپردن ABFPS (Abraham Became First President of States) است.

الگوهای ساختاری

  •  وفق دهنده (Adapter): (اینترفیس ‏ها) رابط‏ه های کلاس ‏های مختلف را با یکدیگر تطبیق می‎دهد.
  •  پل (Bridge): انتزاع (abstraction) یک شیء را از پیاده سازی (implementation) آن جدا می‏کند.
  •  کامپوزیت/مرکب (Composite): ساختار درختی اشیاء ساده و مرکب.
  •  آذینگر (Decorator): مسئولیت ‏هایی را بطور پویا به اشیاء اضافه می‏کند.
  •  نما (Façade): یک تک کلاس که یک زیرسیستم کامل را نشان می‏دهد.
  •  مگس وزن (Flyweight): یک نمونه ‏ی دانه ریز (fine-grained) مورد استفاده جهت به اشتراک گذاری مؤثر.
  • نماینده (Proxy): یک شیء نشان دهنده‎ی شیء دیگر.

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

  •  میانجی (Mediator): ارتباط ساده شده بین کلاس‎ها را مشخص می‎کند.
  •  یادگاری (Memento) وضعیت داخلی یک شیء را ضبط و بازیابی می‏کند.
  •  مفسر (Interpreter): روشی برای دربرگیری عناصر زبان در یک برنامه.
  •  تکرار کننده (Iterator): مرتبا به عناصر یک مجموعه دسترسی می‏یابد.
  •  زنجیره‎ی مسئولیت (Chain of Resp): روشی برای انتقال یک درخواست بین زنجیره ‏ای از اشیاء.
  •  فرمان (Command): یک درخواست فرمان را به عنوان یک شیء کپسوله سازی می‏کند.
  •  وضعیت (Satate): رفتار یک شیء را هنگامی که ضعیت آن عوض می‏شود تغییر می‏دهد.
  •  استراتژی (Strategy): یک الگوریتم را داخل یک کلاس کپسوله سازی می‏کند.
  •  ناظر (Observer): روشی برای اعلان تغییر به تعدادی از کلاس ‏ها.
  •  متد الگو (Template Method): مراحل دقیق یک الگوریتم را به یک زیرکلاس منتقل می‏کند.
  •  بازدید کننده (Visitor): یک عملیات جدید را برای یک کلاس بدون تغییر مشخص می‎کند.

ممکن است Design Pattern کارخانه را توضیح دهید؟

الگوی کارخانه یکی از انواع الگوهای آفرینشی است که در آموزش Design Pattern آن را بررسی میکنیم. این موضوع را می‏توانید از نام خود کارخانه که هدف آن ساخت و ایجاد چیزی است متوجه شوید.

در دنیای معماری نرم‏ افزار الگوی کارخانه به منظور متمرکز کردن ایجاد اشیاء است.در زیر قطعه کد یک سرویس گیرنده/مشتری که صورت حساب‎های متفاوتی دارد آورده شده است.

این صورت حساب‎ها بسته به نوع صورت حساب که توسط سرویس گیرنده مشخص می‎شود ایجاد می‏شوند.

دو مسئله در رابطه با کد زیر وجود دارد:

 مسئله ‏ی اول: تعداد زیادی کلید واژه ‏ی ‘جدید’ (‘new’) پخش شده در سرویس گیرنده داریم.

به نوعی دیگر، سرویس گیرنده با فعالیت ‏های ایجاد شیء بسیاری بارگذاری شده ، که می‏تواند موجب پیچیدگی زیاد منطق سرویس گیرنده شود.

مسئله ‏ی دوم: این است که سرویس گیرنده نیاز دارد تا از تمامی انواع صورت حساب‏ ها آگاهی داشته باشد.

بنابراین اگر یک نوع کلاس صورت حساب دیگر به نام ‘InvoiceWithFooter’ (صورت حساب با پاورقی) اضافه می‎کنیم.

نیاز است تا کلاس جدید را در سرویس گیرنده ارجاع دهیم و همچنین مجددا سرویس گیرنده را کامپایل کنیم.

 

آموزش Design Pattern

انواع مختلف صورتحساب

با در نظر گرفتن این مسائل به عنوان مسائل پایه، در آموزش Design Pattern ، حال بررسی خواهیم کرد که چگونه الگوی کارخانه می‏تواند در جهت حل مسئله ‏ی مشابه به ما کمک کند.

شکل زیر، ‘الگوی کارخانه’ دو کلاس عینی (concrete class) ‘ClsInvoiceWithHeader’ و ‘ClsInvoiceWithOutHeader’ را نشان می‏دهد.

مسئله‏ ی اول این بود که این کلاس‎ها در تماس مستقیم با سرویس گیرنده هستند که به تعداد زیادی واژه‏ ی کلیدی ‘new’ پخش شده در کد سرویس گیرنده می‏انجامد.

این مسئله با معرفی یک کلاس جدید ‘ClsFactoryInvoice’ که تمامی کارهای ایجاد اشیاء را انجام می‎دهد حذف می‏شود.

مسئله ‏ی دوم این بود که کد سرویس گیرنده از هر دو کلاس عینی، یعنی ‘ClsInvoiceWithHeader’ و ‘ClsInvoiceWithOutHeader’ آگاه است.

این امر هنگامی که انواع جدیدی از صورت حساب اضافه می‎کنیم به کامپایل مجدد کد سرویس گیرنده می‏انجامد.

برای نمونه اگر ‘ClsInvoiceWithFooter’ را اضافه کنیم، نیاز است که کد سرویس گیرنده تغییر کرده و به تبع مجددا کامپایل شود.

برای حذف این مسئله، یک رابط رایج ‘IInvoice’ را معرفی کرده‎ایم.

هر دو کلاس عینی ‘ClsInvoiceWithHeader’ و ‘ClsInvoiceWithOutHeader’ از رابط ‘IInvoice’ ارث برده و آن را پیاده سازی می‏کنند.

سرویس گیرنده تنها رابط ‘IInvoice’ را ارجاع می‎دهد که منجر به صفر اتصال بین سرویس گیرنده و کلاس‎های عینی (‘ClsInvoiceWithHeader’ و ‘ClsInvoiceWithOutHeader’) می‏شود.

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

در یک خط، ایجاد اشیاء توسط ‘ClsFactoryInvoice’ مراقبت می‎شود و قطع اتصال سرویس گیرنده از کلاس‎های عینی توسط رابط ‘IInvoice’ مراقبت می‏شود.

آموزش Design Pattern

Design Pattern کارخانه

در زیر قطعه کد ، الگوی کارخانه چگونه می‏تواند در سی شارپ پیاده سازی شود آورده شده است.

به منظور اجتناب از کامپایل مجدد سرویس گیرنده، رابط صورت حساب ‘IInvoice’ را معرفی کرده ‏ایم.

هر دو کلاس عینی ‘ClsInvoiceWithHeader’ و ‘ClsInvoiceWithOutHeader’ از رابط ‘IInvoice’ ارث برده و آن را پیاده سازی می‏کنند.

آموزش Design Pattern

 رابط و کلاس‏های عینی در آموزش Design Pattern

ما همچنین یک کلاس مازاد ‘ClsFactoryInvoice’ با یک تابع ‘getInvoice()’ که اشیاء هر دو صورت حساب را بسته به مقدار ‘intInvoiceType’ تولید خواهد کرد معرفی کرده ‏ایم.بطور خلاصه، منطق ایجاد اشیاء را در ‘ClsFactoryInvoice’ متمرکز کرده‏ ایم.

سرویس گیرنده تابع ‘getInvoice’ را برای تولید کلاس ‏های صورت حساب فراخوانی می‏کند. یکی از مهم‎ترین نکاتی که باید به آن اشاره شود این است که سرویس گیرنده تنها به نوع ‘IInvoice’ اشاره دارد و کلاس کارخانه ‘ClsFactoryInvoice’ نیز نوع مشابهی از ارجاع را می‏دهد.

این امر به سرویس گیرنده کمک می‎کند تا کاملا از کلاس‏ های عینی جدا باشد، بنابراین حالا زمانی که کلاس ‏ها و انواع صورت حساب جدید اضافه می‏کنیم نیاز نیست سرویس گیرنده را مجددا کامپایل کنیم.

آموزش Design Pattern

 کلاس کارخانه که اشیاء را تولید می‏کند.

ممکن است الگوی کارخانه ‏ی انتزاعی را توضیح دهید؟

کارخانه‏ ی انتزاعی بر روی الگوی کارخانه ‏ی پایه توسعه می‎یابد. کارخانه‏ ی انتزاعی به ما کمک می‏کند تا کلاس ‏های یکسان الگوی کارخانه به عنوان یک رابط یکپارچه بهم پیوند می‏دهد.

بنابراین در آموزش Design Pattern اساسا تمامی الگوهای رایج کارخانه اکنون از کلاس کارخانه ‏ی انتزاعی مشترکی که آن‏ها را در یک کلاس مشترک بهم پیوند می‏دهد ارث می‎برند.

تمامی دیگر موارد مربوط به الگوی کارخانه بطور مشابهی که در سوال قبل بحث شد باقی می‏مانند.یک کلاس کارخانه به ما کمک می‏کند تا ایجاد کلاس‎ها را متمرکز کنیم.

کارخانه‏ ی انتزاعی به ما کمک میکند تا بین الگوهای کارخانه‏ ی مرتبط یکنواختی ایجاد کنیم که این امر به رابط کاربری ساده تری برای سرویس گیرنده می‏انجامد.

 

آموزش Design Pattern

 کارخانه ‏ی انتزاعی الگوهای کارخانه‏ ی مرتبط را به یکدیگر پیوند می‎دهد.

 

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

همانطور که پیش‏تر گفته شد کلاس ‏های الگوی کارخانه (factory1 و factory2) را داریم که از طریق ارث‏ بری به یک کارخانه ‏ی انتزاعی معمول (AbstractFactory Interface) پیوند خورده‏ اند.

کلاس‏های کارخانه بر روی کلاس‏ های عینی که مجددا از رابط معمول مشتق شده ‏اند قرار گرفته ‏اند. برای نمونه در تصویر “پیاده سازی کارخانه‏ ی انتزاعی” هر دو کلاس عینی ‘product1’ و ‘product2’ از یک رابط یعنی ‘common’ ارث می‏برند.

سرویس گیرنده ‏ای که می‏خواهد از کلاس عینی استفاده کند تنها با کارخانه ‏ی انتزاعی و رابط معمولی که کلاس ‏های عینی از آن ارث می‏برند در ارتباط خواهد بود.

 

آموزش Design Pattern

پیاده سازی کارخانه‏ ی انتزاعی در آموزش Design Pattern

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

ما سناریو را که در آن فعالیت‏ های خلاقانه ‏ی رابط کاربری را برای جعبه ‏های متن (textbox) و دکمه ‏ها از طریق کلاس ‏های کارخانه ‏ی متمرکز خود ‘ClsFactoryButton’ و ‘ClsFactoryText’ داریم.

هر دوی این کلاس ‏ها از رابط معمول ‘InterfaceRender’ ارث می‏برند. هر دو کارخانه ‏ی ‘ClsFactoryButton’ و ‘ClsFactoryText’ از کلاس معمول ‘ClsAbstractFactory’ ارث می‏برند.

تصویر “مثالی برای AbstractFactory” نحوه ‏ی مرتب شدن این کلاس‏ها و کد سرویس گیرنده را برای همان نشان می‏دهد.

یکی از مهم‏ترین نکاتی که درباره‏ ی کد سرویس گیرنده لازم به ذکر است این است که با کلاس‏ های عینی ارتباطی ندارد.

برای ایجاد شیء از کلاس کارخانه‏ ی انتزاعی ( ClsAbstractFactory ) استفاده می‏کند و برای فراخوانی پیاده سازی کلاس عینی، متدها را از طریق رابط ‘InterfaceRender’ فراخوانی می‏کند.

بنابراین کلاس ‘ClsAbstractFactory’ یک رابط معمول برای هر دو کارخانه ‏ی ‘ClsFactoryButton’ و ‘ClsFactoryText’ فراهم می‏کند.

آموزش Design Pattern

مثالی برای کارخانه‏ ی انتزاعی در آموزش Design Pattern

کد نمونه برای کارخانه ‏ی انتزاعی را بررسی خواهیم کرد. قطعه کد زیر “کارخانه ‏ی انتزاعی و قطعه کد کارخانه” نحوه‏ ی ارث‏ بری کلاس‏ های الگوی کارخانه از کارخانه ‏ی انتزاعی را نشان می‏دهد.

 

آموزش Design Pattern

کارخانه ‏ی انتزاعی و قطعه کد کارخانه در آموزش Design Pattern

تصویر “رابط معمول برای کلاس‏ های عینی” نحوه‏ ی ارث‏ بری کلاس های عینی از یک رابط معمول ‘InterfaceRender’ که متد ‘render’ را در تمامی کلاس‏ های عینی اعمال می‏کند را نشان می‏دهد.

آموزش Design Pattern

رابط معمول برای کلاس‏های عینی در آموزش Design Pattern

آخرین مورد ،کد سرویس گیرنده است که از رابط ‘InterfaceRender’ و کارخانه‏ ی انتزاعی ‘ClsAbstractFactory’ برای فراخوانی و ایجاد اشیاء استفاده می‏کند.

در آموزش Design Pattern ، یکی از مهم‏ترین نکات در رابطه با کد این است که کاملا از کلاس ‏های عینی مجزاست. به همین علت هر تغییر در کلاس ‏های عینی مانند افزودن و حذف کلاس ‏های عینی نیازی به تغییرات سطح سرویس گیرنده ندارد.

آموزش Design Pattern

سرویس گیرنده، رابط و کارخانه‏ ی انتزاعی

ممکن است الگوی سازنده را توضیح دهید؟

در آموزش Design Pattern ، سازنده به هنگام طبقه بندی در دسته‏ ی الگوهای آفرینشی قرار می‏گیرد. الگوی سازنده به ما در جدا کردن ساخت یک شیء پیچیده ،از نمایش آن کمک می‏کند تا فرآیند ساختی یکسان بتواند نمایش ‏های متفاوتی ایجاد کند.

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

آموزش Design Pattern

مفهوم سازنده در آموزش Design Pattern

برای فهم اینکه منظور ما از ساخت و نمایش چیست، بیایید مثال توالی “آماده کردن چای” در زیر را بررسی کنیم.

می‏توانید ببینید در تصویر “آماده کردن چای” از مراحل آماده سازی یکسان می‏توانیم سه نمایش چای را بگیریم (یعنی چای بدون شکر، چای با شکر / شیر و چای بدون شیر).

آموزش Design Pattern

 آماده کردن چای

حال بیایید یک مثال همزمان در دنیای نرم ‏افزار را بررسی کنیم تا ببینیم سازنده چگونه می‏تواند فرآیند ایجادی پیچیده و نمایش آن را جدا کند.

فرض کنید برنامه‏ ای داریم که در آن نیاز است تا گزارشی یکسان در قالب ‘PDF’ یا ‘EXCEL’ نمایش داده شود.

تصویر “درخواست یک گزارش” دنباله مراحل را برای دریافت موارد یکسان نشان می‏دهد.

بسته به نوع گزارش، یک گزارش جدید ایجاد شده، نوع گزارش مشخص و تنظیم می‏شود، هدرها و فوترها (headers and footers) برای گزارش تنظیم شده و در نهایت گزارش را برای نمایش دریافت می‏کنیم.

آموزش Design Pattern

درخواست یک گزارش

حال بیایید از نقطه نظری دیگر همانطور که در تصویر “دیدگاهی متفاوت” نشان داده شده به مسئله نگاه کنیم.

جریانی مشابه که در “درخواست یک گزارش” شرح داده شده حال در نمایش و ساخت معمول مورد تجزیه و تحلیل قرار می‏گیرد.

فرآیند ساخت برای هر دو نوع گزارش یکسان است اما منجر به نمایش‏ های متفاوتی می‏شوند.

آموزش Design Pattern

دیدگاهی متفاوت آموزش Design Pattern

مسئله‏ ی گزارش مشابه را در نظر خواهیم گرفت و سعی خواهیم کرد تا آن را بطور مشابه با استفاده از الگوهای سازنده حل کنیم.

هنگامی که بخواهید الگوهای سازنده را پیاده سازی کنید، سه بخش اصلی وجود دارد.

  • سازنده (Builder):  سازنده مسئول تعریف فرآیند ساخت برای بخش‏ های مجزا است. سازنده فرآیندهایی مجزا برای مقداردهی اولیه و پیکربندی محصول دارد.
  •  جهت دهنده (Director): جهت دهنده فرآیندهای مجزا را از سازنده گرفته و توالی را برای ساخت محصول تعریف می‏کند.
  •  محصول (Product):  محصول شیء نهایی است که از هماهنگی سازنده و جهت دهنده حاصل می‏شود.

ابتدا بیایید نگاهی به سلسله مراتب کلاس سازنده بیندازیم. کلاسی انتزاعی به نام ‘ReportBuilder’ که سازنده ‏های دلخواه/سفارشی مانند سازنده ‏ی ‘ReportPDF’ و سازنده‏ ی ‘ReportEXCEL’ از آن ساخته خواهند شد.

 

آموزش Design Pattern

سلسله مراتب کلاس سازنده در آموزش Design Pattern

تصویر “کلاس‏ های سازنده در کد واقعی” متدهای کلاس ‏ها را نشان می‏دهد. برای تولید گزارش ابتدا نیاز است که ابتدا یک گزارش جدید ایجاد کرده، نوع گزارش را (به EXCEL یا PDF) تعیین کرده، هدرهای گزارش را تنظیم کرده، فوترهای گزارش را تعیین کرده و در نهایت گزارش را دریافت کنید.

ما دو سازنده ‏ی سفارشی، یکی برای( ‘PDF’ ReportPDF) و دیگری برای (‘EXCEL’ ReportExcel) تعریف کرده ‏ایم. این دو سازنده‏ ی سفارشی فرآیند خود را بر اساس نوع گزارش تعریف می‏کنند.

آموزش Design Pattern

 کلاس ‏های سازنده در کد واقعی در آموزش Design Pattern

حال بیایید نحوه ‏ی کار جهت دهنده را درک کنیم. کلاس ‘clsDirector’ سازنده را گرفته و فرآیند متد مجزا را به روشی ترتیبی فراخوانی می‏کند.

بنابراین جهت دهنده مانند راننده ‏ای است که تمامی فرآیندهای مجزا را گرفته و آن‏ها را به روشی ترتیبی برای تولید محصول نهایی، که در این مورد گزارش است، فراخوانی می‏کند.

تصویر “جهت دهنده در عمل” نشان می‏دهد که متد ‘MakeReport’ چگونه فرآیند مجزا را برای تولید محصول گزارش از طریق PDF یا EXCEL فراخوانی می‎کند.

آموزش Design Pattern

جهت دهنده در عمل

جزء/کامپوننت سوم در سازنده محصولی است که چیزی جز کلاس گزارش در این مورد نیست.

آموزش Design Pattern

کلاس گزارش

حال بیایید نگاهی کلی به پروژه‏ ی سازنده بیندازیم. تصویر “سرویس گیرنده، سازنده، جهت دهنده و محصول” نشان می‏دهد که چگونه برای دستیابی به الگوی سازنده کار می‏کنند.

سرویس گیرنده شیء کلاس جهت دهنده را ایجاد می‏کند و سازنده ‏ی مناسب را برای مقدار دهی اولیه ‏ی محصول ارسال می‏کند.

بسته به سازنده، محصول مقدار دهی اولیه/ایجاد می‏شود و در نهایت به سرویس گیرنده فرستاده می‏شود.

آموزش Design Pattern

سرویس گیرنده، سازنده، جهت دهنده و محصول

خروجی چیزی شبیه به شکل زیر خواهد بود. می‏توانیم دو نوع گزارش نمایش داده شده به همراه هدرهایشان بر اساس سازنده ببینیم.

آموزش Design Pattern

 خروجی نهایی سازنده در آموزش Design Pattern

ممکن است الگوی نمونه‏ ی اولیه را توضیح دهید؟

الگوی نمونه ‏ی اولیه در زیر گروه بخش الگوهای آفرینشی قرار می‏گیرد. راهی برای ایجاد اشیای جدید از نمونه‏ ی موجود شیء به ما می‏دهد.

در یک جمله ،  ما شیء موجود را به همراه داده‏ هایش همانند سازی می‏کنیم. با همانند سازی، هیچ تغییری بر روی شیء همانند سازی شده تأثیری بر مقدار شیء اصلی نخواهد گذاشت.

اگر فکر می‏کنید تنها با تنظیم اشیاء می‏توانیم همانندی بدست بیاوریم پس در اشتباهید. با تنظیم یک شیء به شیء دیگر، ارجاع شیء BYREF را تنظیم می‏کنیم.

بنابراین تغییر شیء جدید، شیء اصلی را نیز تغییر داده است. برای درک روشن‏ تر مفهوم BYREF تصویر ‘BYREF’ زیر را در نظر بگیرید.

در ادامه توالی کد زیر آمده است:

  •  در گام اول شیء نخستین ، یعنی obj1 از class1 را ایجاد کرده ‏ایم.
  •  در گام دوم شیء دوم یعنی obj2 از class1 را ایجاد کرده‏ ایم.
  •  در گام سوم مقادیر شیء قدیمی یعنی obj1 را به ‘old value’ تنظیم می‏کنیم.
  • در گام چهارم obj1 را به obj2 تنظیم می‏کنیم.
  •  در گام پنجم مقدار obj2 را تغییر می‏دهیم.
  •  حال هر دو مقدار را نمایش می‏دهیم و دریافت ه‏ا ، که هر دو شیء مقدار جدید را دارا هستند.

آموزش Design Pattern

BYREF در آموزش Design Pattern

نتیجه و جمع‏ بندی مثال بالا این است که اشیاء ، هنگامیکه به اشیاء دیگر تنظیم می‏شوند بصورت BYREF تنظیم می‏شوند.

بنابراین تغییر مقادیر شیء جدید مقدار شیء قدیمی را نیز تغییر می‏دهد.

نمونه ‏های بسیاری وجود دارد هنگامیکه می‏خواهیم تغییرات شیء کپی جدید شیء قدیمی را تحت تأثیر قرار ندهند. پاسخ این مسئله الگوهای نمونه ‏ی اولیه است.

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

در تصویر زیر “نمونه ‏ی اولیه در عمل”، کلاس مشتری ‘ClsCustomer’ را داریم که نیاز به همانند سازی دارد.

این امر می‏تواند در سی شارپ با استفاده از متد ‘MemberWiseClone’ حاصل شود.

در JAVA برای دستیابی به نتیجه‏ ی یکسان، متد ‘Clone’ را داریم. در همان کد، کد سرویس گیرنده را نیز نشان داده ‏ایم.

دو شیء از کلاس مشتری ‘obj1’ و ‘obj2’ ایجاد کرده ‏ایم. هیچ تغییری بر روی ‘obj2’، بر ‘obj1’ تأثیر نخواهد گذاشت، چراکه یک کپی کاملا همانند سازی شده است.

آموزش Design Pattern

 نمونه ‏ی اولیه در عمل

ممکن است کپی سطحی و کپی عمیق در الگوهای نمونه ‏ی اولیه را توضیح دهید؟

در این آموزش Design Pattern دو نوع همانند سازی برای الگوهای نمونه ‏ی اولیه وجود دارد. یکی همانند سازی سطحی است که در سوال اول خواندید.

در کپی سطحی تنها آن شیء همانند سازی می‏شود، هر شیء که در آن شیء باشد همانند سازی نمی‏شود.

برای نمونه تصویر “همانند سازی عمیق در عمل” را در نظر بگیرید، یک کلاس مشتری داریم و یک کلاس آدرس که داخل کلاس مشتری جمع شده است.

‘MemberWiseClone’ تنها کلاس مشتری ‘ClsCustomer’ را همانند سازی خواهد کرد اما نه کلاس ‘ClsAddress’ را بنابراین تابع ‘MemberWiseClone’ را در کلاس آدرس نیز افزودیم.

حالا هنگامیکه تابع ‘getClone’ را فراخوانی می‏کنیم، تابع همانند سازی والد/پدر و همچنین تابع همانند سازی فرزند را فراخوانی می‏کنیم، که منجر به همانند سازی شیء کامل خواهد شد.

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

آموزش Design Pattern

 همانند سازی عمیق در عمل

ممکن است الگوی یگانه/سینگلتون را توضیح دهید؟


Punch :-  Create a single instance of object and provides access to this single instance via a central point.

مواقعی در پروژه وجود دارد که تنها می‏خواهیم یک نمونه از شیء ایجاد شده و بین سرویس گیرنده ‏ها به اشتراک گذاشته شود.

برای نمونه فرض کنیم دو کلاس زیر، currency (ارز) و country (کشور) را داریم.

این کلاس ‏ها داده‏ های عظیمی را بارگذاری می‏کنند که در پروژه بارها و بارها بدان اشاره خواهد شد.

می‏خواهیم یک تک نمونه از کلاس را برای دریافت بهره ‏ی عملکردی از طریق عدم ارسال درخواست چندین باره به پایگاه داده به اشتراک بگذاریم.


public class Currency
    {
        List<string> oCurrencies = new List<string>();
        public Currency()
        {
            oCurrencies.Add("INR");
            oCurrencies.Add("USD");
            oCurrencies.Add("NEP");
            oCurrencies.Add("GBP");

        }
        public IEnumerable<string> getCurrencies()
        {
            return (IEnumerable<string>)oCurrencies;
        }
    }
</string></string></string></string>

 


public class Country
    {
        List<string> oCountries = new List<string>();
        public Country()
        {
            oCountries.Add("India");
            oCountries.Add("Nepal");
            oCountries.Add("USA");
            oCountries.Add("UK");

        }
        public IEnumerable<string> getCounties()
        {
            return (IEnumerable<string>) oCountries;
        }
    }
</string></string></string></string>

پیاده سازی الگوی سینگلتون یک فرآیند ۴ مرحله ‏ای است.

 

 مرحله ۱_ یک کلاس مهر و موم شده (sealed) با یک سازنده‏ ی خصوصی (private constructor) ایجاد کنید.

سازنده‏ ی خصوصی به این دلیل اهمیت دارد که سرویس گیرنده ‏ها نتوانند اشیاء کلاس را بطور مستقیم ایجاد کنند.

اگر ابتدای کار را به یاد داشته باشید، هدف اصلی این الگو ایجاد یک تک نمونه از شیئی است که می‏تواند بطور سراسری به اشتراک گذاشته شود، بنابراین نمی‏خواهیم اختیار ایجاد نمونه ‏ها بطور مستقیم را به سرویس گیرنده بدهیم.


public sealed class GlobalSingleton
    {
private GlobalSingleton() { }

	………..
	……….
	}

 

مرحله ۲- اشیاء تجمع شده از کلاس ‏هایی (برای این مثال ارز و کشور هستند) که تک نمونه ‏های آن‏ها را می‏خواهیم ایجاد کنید.


public sealed class GlobalSingleton
    {
        // object which needs to be shared globally
        public Currency Currencies = new Currency();
        public Country Countries = new Country();

مرحله ۳_ یک شیء ایستای فقط خواندنی (read-only) از خود کلاس ایجاد کرده و همان را از طریق خاصیت ایستایی همانطور که در زیر نشان داده شده نمایش دهید.


public sealed class GlobalSingleton
    {
	….
	…
// use static variable to create a single instance of the object
static readonly GlobalSingleton INSTANCE = new GlobalSingleton();

public static GlobalSingleton Instance
        {
            get
            {
              
                return INSTANCE;
            }
        }       
    }

مرحله ۴:- حال می‏توانید شیء سینگلتون را با استفاده از کد زیر از سرویس گیرنده به کار ببرید.


GlobalSingleton oSingle = GlobalSingleton.Instance;
Country o = osingl1.Country;

در زیر کد کامل برای الگوی سینگلتون که در بالا تکه تکه در مورد آن بحث کردیم آورده شده است.

public sealed class GlobalSingleton
    {
        // object which needs to be shared globally
        public Currency Currencies = new Currency();
        public Country Countries = new Country();

        // use static variable to create a single instance of the object
        static readonly GlobalSingleton INSTANCE = new GlobalSingleton();

        /// This is a private constructor, meaning no outsides have access.
        private GlobalSingleton() 
        { }
        
public static GlobalSingleton Instance
        {
            get
            {
              
                return INSTANCE;
            }
        }       
    }

ممکن است الگوهای فرمان را توضیح دهید؟

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

بسیار خوب بیایید معنای این موضوع را درک کنیم. تصویر “منو و فرمان‏ ها” را در نظر بگیرید، اعمال متفاوتی بسته به اینکه کدام منو کلیک شود داریم. بنابراین، بسته به اینکه کدام منو کلیک شده، یک رشته که متن عمل را در رشته ‏ی عمل خواهد داشت، فرستاده ‏ایم.

بسته به رشته ‏ی عمل، عمل را اجرا خواهیم کرد. مورد بدی که در این کد وجود دارد این است که تعداد زیادی شرط ‘IF’ دارد که کد را مبهم‏ تر می‏کند.

آموزش Design Pattern

منو و فرمان ‏ها در آموزش Design Pattern

الگوی فرمان عمل بالا را به اشیاء می‏برد. این اشیاء هنگامیکه اجرا می‏شوند که در واقع فرمان را اجرا می‏کنند.

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

تمامی اعمال بالا در کلاس ‏ها گنجانده می‏شوند، مثلا عمل Exit (خروج) در ‘clsExecuteExit’ گنجانده می‏شود، عمل open (باز کردن) در ‘clsExecuteOpen’ گنجانده می‏شود، عمل print (پرینت) در ‘clsExecutePrint’ گنجانده می‏شود و به همین منوال برای دیگر اعمال تمامی این کلاس‏ها از یک رابط معمول ‘IExecute’ ارث برده ‏اند.

آموزش Design Pattern

 اشیاء و فرمان در آموزش Design Pattern

با به کارگیری تمام کلاس ‏های عمل، حال می‏توانیم[ invoker ] که مسئولیت فراخوانی را بر عهده دارد را بسازیم.

کار اصلی invoker ، این است که عمل را با کلاس ‏هایی که عمل  دارند نگاشت کند.

بنابراین تمامی اعمال را در یک مجموعه (collection)، به عبارت دیگر arraylist اضافه کرده ‏ایم. یک متد ‘getCommand’ که یک رشته می‏گیرد و شیء انتزاعی ‘IExecute’ را برمی‏گرداند را نشان داده‏ ایم. حال کد سرویس گیرنده تمیز و خوانا است.تمامی شرط‏ های ‘IF’ حالا به کلاس ‘clsInvoker’ برده شده ‏اند.

آموزش Design Pattern

Invoker و سرویس گیرنده ‏ی تمیز و خوانا در آموزش Design Pattern

Design Pattern به همراه یک پروژه

بهترین روش برای آموزش Design Pattern انجام یک پروژه است. بنابراین، این آموزش الگو به الگو به شما آموزش می‏دهد.



مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۳۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره--
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۶۵,۵۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...