سلام. میتونید برای آشنایی با الگوهای طراحی (یا همون دیزاین پترن های) زبان جاوا و دیدن لیست مقالاتِ آموزشیشون، به مقاله ی یک فنجان جاوا - دیزاین پترن ها Design Patterns مراجعه کنید.
همونطور که گفته شده این الگو زیرمجموعه ی الگوهای تکوینی یا ساختنی هست و لیست مقالات آموزشیِ من در مورد الگوهای Creational عبارت هستند از:
این الگو که نام اصلیش Abstract Factory هست (اگه از ساختار Abstract استفاده بشه، اگه نشه که همون Factory of Factory :دی)، شباهت زیادی به الگوی Factory داره، و در حقیقت همونه فقط با دیدی کلی تر!
(در صورتی که با الگوی Factory الگو آشنا نیستین حتماً اول مقاله ی یک فنجان جاوا - دیزاین پترن ها - Factory رو مطالعه کنین)
بذارین با مثالی مشابه مثال های الگوی Factory پیش بریم. فرض کنیم کلاس Vehicle و کلاس های Car و MotorCycle (که از Vehicle ارث بردن) رو داریم:
interface Vehicle { void showVehicleType(); } class Car implements Vehicle { @Override public void showVehicleType() { System.out.println("Vehicle: Car"); } } class MotorCycle implements Vehicle { @Override public void showVehicleType() { System.out.println("Vehicle: MotorCycle"); } }
و کنار این کلاس ها، کلاس های دیگه ای برای تعیین رنگ وسیله ی نقلیه داشته باشیم:
interface Color { void fill(); } class Blue implements Color { @Override public void fill() { System.out.println("Color : Blue"); } } class Red implements Color { @Override public void fill() { System.out.println("Color : Red"); } }
حالا یه کلاس میسازیم به اسم AbstractFactory که بقیه ی کارخونه ها ازش ارث میبرن و یه کلاس به اسم FactoryProducer که با توحه به درخواست ما، کارخونه ی مورد نیازمون رو برمیگردونه (در ادامه بیشتر متوحه میشیم منظورمون چیه)
abstract class AbstractFactory { } class FactoryProducer { public static AbstractFactory getFactory(String choice) { if (choice.equals("VEHICLE")) { return new VehicleFactory(); } else if (choice.equals("COLOR")) { return new ColorFactory(); } return null; } }
حالا کافیه کارخونه هایی که میخوایم رو بسازیم:
class VehicleFactory extends AbstractFactory { public Vehicle getVehicle(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; } } class ColorFactory extends AbstractFactory { Color getColor(String color) { if (color == null) { return null; } if (color.equals("RED")) { return new Red(); } if (color.equals("BLUE")) { return new Blue(); } return null; } }
و برای استفاده از این کلاس ها میتونیم به شکل زیر عمل کنیم:
VehicleFactory vehicleFactory = (VehicleFactory)FactoryProducer.getFactory("VEHICLE"); Vehicle car = vehicleFactory getVehicle("Car"); car.showVehicleType(); Vehicle motorCycle = vehicleFactory.getVehicle("MotorCycle"); motorCycle.showVehicleType(); ColorFactory colorFactory = (ColorFactory)FactoryProducer.getFactory("COLOR"); Color redColor = colorFactory.getColor("RED"); redColor.fill(); Color blueColor = colorFactory.getColor("BLUE"); blueColor.fill();
دقیقا شبیه مثال های مقاله ی مربوط به الگوی Factory که اول این مقاله لینکش اومده، میشه تغییراتی روی شیوه ی پیاده سازی ایجاد کرد، مثل استفاده از رشته های ثابت، enum یا توابع مجزا.بصورت خلاصه هم مجدد مرور کنیم که چه اتفاقی توی کد های مثال افتاد. بعد از تعریف کلاس های خودمون و به اصطلاح کارخونه هاشون (Vehicle، Car، MotorCycle، Color، Red، Blue) اومدیم کلاسی به اسم AbstractFactory تعریف کردیم که تمامی Factory هامون مثل ColorFactory و VehicleFactory ازش ارث میبرن (و طبیعتاً در صورت نیاز میشه توابع abstract یا ... توی کلاس AbstractFactory تعریف کرد). و در نهایت این کلاس FactoryProducer ساختیم با این وظیفه که بهش بگیم چه کارخونه ای میخوایم. یعنی روند به این صورته که میایم به FactoryProducer میگیم که مثلاً کارخونه ی سازنده ی Vehicle رو میخوایم و اون بهمون میده و میتونیم از vehicleFactory برای ساخت انواع وسیله نقلیه استفاده کرد. همین روند برای کارخونه ی سازنده ی رنگ ColorFactory هم صدق میکنه.
منتشر شده در ویرگول توسط محمد قدسیان https://virgool.io/@mohammad.ghodsian