من اینجا هستم تا بحث الگوهای طراحی را ادامه دهم. امروز یک الگوی طراحی خلاقانه دیگر به نام کارخانه ساده را توضیح خواهیم داد.
اگر به مقالات قبلی ما نگاه نکرده اید، از طریق لینک زیر بروید:
قبل از صحبت در مورد اجرای آن، اجازه دهید با چند سوال اساسی مانند زیر شروع کنیم.
هدف از الگوی کارخانه
من می توانم به دو هدف اصلی استفاده از الگوی کارخانه فکر کنم. یکی برای دستیابی به اتصال آزاد بین مشتری و لایه کسب و کار، دیگری این است که همه کدهای منطق نمونه سازی شی را در یک مکان نگه دارید.
هدف از اتصال شل
در توسعه نرمافزارهای مدرن که تغییرات در سیستمهای موجود مکرر است و انتظار میرود طراحی نرمافزار مقیاسپذیر باشد، نداشتن یک طراحی آزادانه میتواند مشکلات زیادی ایجاد کند.
به عنوان مثال، در برنامهای با معماری 3 لایه، اگر منطق ایجاد شی در سمت کلاینت باشد، برای هر اضافه شدن جدید کلاسهای بتن، توسعهدهنده باید نه تنها کسبوکار، بلکه لایه مشتری را نیز اصلاح کند. به قابلیت نگهداری و تلاش آزمایشی اضافه شده فکر کنید.
اگر مشتری فقط از قراردادهای سطح بالا آگاه باشد و از اجرای واقعی آن آگاه نباشد چطور؟
بله، شما درست این را متوجه شدید! مشتری فقط باید نوع شی مورد نیاز خود را ارسال کند و با استفاده از الگوی کارخانه آن را دریافت می کند.
تئوری بس است حالا بیایید در مورد اجرا صحبت کنیم.
نحوه استفاده از الگوی کارخانه ساده
بیایید سعی کنیم با استفاده از یک مثال ساده درک کنیم.
فرض کنید مشتری می خواهد از قیمت خودروهای برندهای مختلف در جاده مطلع شود و رابطی مانند زیر داشته باشد.
- interface ICar
- {
- string GetOnRoadPrice(string model);
- }
اکنون باید یک کلاس Factory ایجاد کنیم که بین لایه های مشتری و کسب و کار قرار می گیرد و شی مورد نیاز را بر اساس نام تجاری خودرو ارائه می کند.
- class CarFactory
- {
- static public ICar GetCar(string carBrand)
- {
- if (carBrand == "Maruti")
- {
- return new Maruti();
- }
- else if (carBrand == "Hyundai")
- {
- return new Hyundai();
- }
- return null;
- }
- }
و در اینجا کلاسهای کسب و کار واقعی شروع می شود.
- class Maruti: ICar
- {
- public string GetOnRoadPrice(string model)
- {
- if (model == "Alto 800 VXI")
- {
- return "3.4 Lakhs INR";
- }
- else
- {
- return "Information not available!";
- }
- }
- }
- class Hyundai: ICar
- {
- public string GetOnRoadPrice(string model)
- {
- if (model == "Grand i10 Magna 1.2 BSV")
- {
- return "5.4 Lakhs INR";
- }
- else
- {
- return "Information not available!";
- }
- }
- }