سلام. میتونید برای آشنایی با الگوهای طراحی (یا همون دیزاین پترن های) زبان جاوا و دیدن لیست مقالاتِ آموزشیشون، به مقاله ی یک فنجان جاوا - دیزاین پترن ها Design Patterns مراجعه کنید.
همونطور که گفته شده این الگو (فکتوری) زیرمجموعه ی الگوهای تکوینی یا ساختنی هست و لیست مقالات آموزشیِ من در مورد الگوهای Creational عبارت هستند از:
همونطور که تا حدودی از اسم این الگو پیداست، با ساختن یه به اصطلاح کارخونه، این امکان رو فراهم میکنیم که زمان تولید شئ، بجای اینکه خودمون تولیدش کنیم، به اون کارخونه بگیم چی میخوایم (ویژگی های شئ مورد نظر رو بهش میدیم) و اون کارخونه خودش شئ رو میسازه و میده بهمون.
مزیت های این الگو عبارتند از کاهش خطوط کد، سهولت توی تولید اشیاء، عدم نیاز به تغییر زیاد در صورت تغییر کلاس (کارخونه خودش تغییر لازمه رو اعمال میکنه) و ...
خب بریم مثالش رو ببینیم:
فرض کنیم یه اینترفیس وسیله ی نقلیه داریم:
public interface Vehicle { void showVehicleType(); }
حالا دو تا کلاس دیگه داریم، یکی ماشین و یکی دیگه موتور که هردوتاشون نوعی وسیله ی نقلیه هستن:
public class Car implements Vehicle { @Override public void showVehicleType() { System.out.println("Vehicle: Car"); } }
public class MotorCycle implements Vehicle { @Override public void showVehicleType() { System.out.println("Vehicle: MotorCycle"); } }
برای پیاده سازی الگوی Factory، یه کلاس به اسم VehicleFactory میسازیم:
public class VehicleFactory { public Vehicle createVehicle(String vehicleType){ if(vehicleType == null){ return null; } else if(vehicleType.equals("Car")){ return new Car(); } else if(vehicleType.equals("MotorCycle")){ return new MotorCycle(); } return null; } }
و حالا فقط کافیه زمانی که میخوایم یه ماشین یا موتور بسازیم به شکل زیر عملی کنیم:
VehicleFactory vehicleFactory = new VehicleFactory(); Vehicle car = vehicleFactory.createVehicle("Car"); car.showVehicleType(); // خروجی Vehicle: Car Vehicle motorCycle = vehicleFactory.createVehicle("MotorCycle"); motorCycle.showVehicleType(); // هروجی Vehicle: MotorCycle
به همین راحتی! ما توی این مثال از رشته برای تعیین نوع وسیله نقلیه استفاده کردیم. مشخصه که هر رشته ای بجز Car یا MotorCycle استفاده کنیم، null بر میگرده.
طبیعتاً میشه شیوه های دیگه ای هم برای نشان دادن نوع وسیله نقلیه استفاده کرد، برای مثل استفاده از رشته ی استاتیک:
public class VehicleFactory { public static final String TYPE_CAR = "Car" public static final String TYPE_MOTORCYCLE = "MotorCycle" public Vehicle createVehicle(String vehicleType){ if(vehicleType == null){ return null; } else if(vehicleType.equals(TYPE_CAR)){ return new Car(); } else if(vehicleType.equals(TYPE_MOTORCYCLE)){ return new MotorCycle(); } return null; } }
و برای تعریف شئ به شکل زیر عمل کنیم:
Vehicle motorCycle = vehicleFactory.createVehicle(VehicleFactory.TYPE_MOTORCYCLE);
یه روش دیگه استفاده از enum برای تعیین نوع کلاس درخواستی هست:
public class VehicleFactory { public enum VehicleTypeEnum{ CAR, MOTOR_CYCLE } public Vehicle createVehicle(VehicleTypeEnum vehicleTypeEnum){ if(vehicleTypeEnum== null){ return null; } else if(vehicleTypeEnum.equals(VehicleTypeEnum.CAR)){ return new Car(); } else if(vehicleTypeEnum.equals(VehicleTypeEnum.MOTOR_CYCLE)){ return new MotorCycle(); } return null; } }
و زمان ساخت شئ به شکل زیر عمل کنیم:
Vehicle car = vehicleFactory.createVehicle(VehicleFactory.VehicleTypeEnum.CAR);
البته برای اینکه اصل open/close از اصول پنجگانه solid رو هم رعایت کرده باشیم میتونیم کلاس کارخونمون رو به شکل زیر پیاده سازی کنیم:
public class VehicleFactory { public Vehicle createCar(){ return new Car(); } public Vehicle createMotorCycle(){ return new MotorCycle(); } }
و طبیعتاً برای ساخت شئ به شکل زیر عمل میکنیم:
Vehicle carObject = vehicleFactory.createCar(); Vehicle motorCycleObject = vehicleFactory.createMotorCycle();
با کلیت این الگو آشنا شدیم. مثل هر الگوی دیگه ای با توجه به زمان، نوع و دلیل استفاده از این الگو میتونیم تغییرات لازمه ی خودمون را پیاده سازی کنیم. برای مثال تابع یا توابع سازنده ی اشیاء داخل کارخونه رو استاتیک تعریف کنیم که نیازی به تعریف شئ از کلاس کارخونه نداشته باشیم، یا در صورت نیاز از الگوی سینگلتون برای اشیاء ساخته شده استفاده کنیم، یا زمان ساخت اشیاء پارامترهایی هم پاس بدیم و با توجه به اون پارامترها تغییراتی روی شئ انجام بدیم، یا حتی بریم سراغ ارثبری ها چند سطحی و ...
حالت جامع تری هم از این الگو وجود داره به اسم Factory of Factory یا AbstractFactory که تحت عنوان مقاله ی یک فنجان جاوا - دیزاین پترن ها - Factory of Factory موجوده و میتونین نگاهی بهش بندازین.
منتشر شده در ویرگول توسط محمد قدسیان https://virgool.io/@mohammad.ghodsian