Zahra Mazloom
Zahra Mazloom
خواندن ۲ دقیقه·۲ سال پیش

الگوی طراحی Factory

اسم: Factory (چرا؟ چون یه کارخونه است که طبق خواسته تو بهت محصول(کلاس) مناسب رو میده)

دسته بندی: Creational (چرا؟ چون داره ساختار بندی رو مشخص میکنه دیگه!)

چه زمانی؟ ما یک سوپرکلاس با چندین زیر کلاس داریم و بر اساس ورودی، باید یکی از زیر کلاس ها رو برگردونیم.

مثال:

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

راه بد چیه؟ یه if - else بذاریم. کاری که همیشه خودم انجام میدم چون حوصله ندارم. (یعنی if نوع مستطیل بود متد drawRectangle رو صدا بزن، else متد drawSquare رو صدا کن). هر وقت هم یه نوع جدید اضافه میشه باید یه else if دیگه به این شرطم اضافه کنم. اگه کار دیگه ای هم با توجه به type انجام بشه، if else ها من بیشتر و بیشتر میشه و همه کدمو پر میکنه. تغییر سخت تر میشه و و ...

راه قشنگ چیه؟

من یه سوپر کلاس میگیرم که کلیت آبجکت رو مشخص میکنه.

public interface Shape { void draw(); }

دو تا زیرکلاس برای Shape دارم که انواع شکل های من هستن:

public class Rectangle implements Shape { @Override public void draw() { System.out.println(&quotInside Rectangle::draw() method.&quot); } }


public class Square implements Shape { @Override public void draw() { System.out.println(&quotInside Square::draw() method.&quot); } }

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

حالا میریم سراغ کلاس factory که باید با توجه به نوع ورودی به من کلاس مناسب رو بده:

public class ShapeFactory { public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase(&quotCIRCLE&quot)){ return new Circle(); } else if(shapeType.equalsIgnoreCase(&quotRECTANGLE&quot)){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase(&quotSQUARE&quot)){ return new Square(); } return null; } }

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

public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); Shape shape1 = shapeFactory.getShape(&quotCIRCLE&quot); shape1.draw(); } }

به همین راحتی و تمیزی!


design patternfactoryjavaclean codepublic class
A programmer who's adding more bugs to the world!
شاید از این پست‌ها خوشتان بیاید