design pattern, java, جاوا, دیزاین پترن

Abstract Factory پترن در جاوا (دیزاین پترن در جاوا)

Abstract Factory پترن در جاوا

در این قسمت تیم کدگیت را با آموزش Abstract Factory پترن در جاوا همراهی کنید. پیش نیاز های این آموزش شامل موارد زیر است:

  1. آشنایی با شی گرایی
  2. آشنایی با متد static
  3. آشنایی با متد
  4. آشنایی با if
  5. آشنایی با abstract
  6. آشنایی با interface
  7. دیزاین پترن

Creational Design Pattern

یکی از زیر شاخه های دیزاین پترن Creational Design Pattern هست. این پترن راهی برای ساخت اشیاست. وقتی از این الگو استفاده میشود که ما میخواهیم در برنامه خود از یک کلاس یک شی را بسازیم. اما برای بسیاری ممکن است ساخت شی بسیار ساده باشد و فقط با new کردن ما یک شی را بسازیم. اما hard code راه حل خوبی نیست!! زیرا ما بعضی اوقات در کد خود هویت یک کلاس را عوض کنیم و در این گونه اوقات ما باید از Creational Design pattern استفاده میکنیم.

Abstract Factory پترن در جاوا

الگوی Abstract Factory یکی از زیر شاخه های Creational Design Pattern است. این الگو را گاهی Factory of Factory نیز میگویند. در آموزش قبل ما در مورد Factory پترن صحبت کردیم. حال Abstract Factory برای تولید کارخانه ای از کارخانه هاست. قبل از توضیح اضافی ایده پشت این پترن را بخوانید.

برنامه نویسی ماژولار یکی از مشکلات امروز دنیای برنامه نویسی است. برنامه نویسان جهان در تلاش هستند که از اضافه کردن کد به یک کلاس برای رسیدن به هدف encapsulation جلوگیری کنند. برای مثال مدیریت شماره تلفن ها را در نظر بگیرید. شماره تلفن ها هر محله تا کشور کد مختلفی دارند و قابل تمایز هستند. ما میخواهیم نرم‌افزاری برای شماره تلفن ها بنویسیم. حال فرض کنید یک کشور جدید را بخواهیم اضافه کنیم، قطعا مسئله کد زنی برای آن پیچیده تر خواهد شد و ما را دچار مشکل خواهد کرد. برای اینکه از این مشکلات جلوگیری کنیم از پترن abstract factory استفاده میکنیم.

Abstract Factory Pattern یک interface یا کلاس abstract در خود دارد که خانواده ای از اشیای مرتبط را به ما میدهد یا بر میگرداند یا به اصطلاح دیگر کارخانه ای از کلاس ها را به ما میدهد به همین دلیل گاهی اوقات این پترن را یک سطح بالاتر از Factory در نظر میگیرند.

مثال Abstract factory پترن در جاوا

در این قسمت به پیاده سازی مثالی Abstract Factory پترن در جاوا میپردازیم.مانند آموزش پترن Factory (منظور Abstract Factory نیست!! در آموزش قبلی این پترن توضیح داده شده) ما یک interface به نام Shape داریم. سه کلاس داریم به نام Rectangle و Square و Circle که Shape را implements میکنند. دقیقا شبیه به همین کلاس ها ما یک interface داریم به نام Color که سه کلاس Red و Blue و Green آن را implements کرده اند. کد آنها به صورت زیر است:

public interface Shape {
     void draw();
}
public class Square implements Shape {

     @Override
     public void draw() {
          System.out.println("Inside Square::draw() method.");

     }

}
public class Rectangle implements Shape {

     @Override
     public void draw() {
          System.out.println("Inside Rectangle::draw() method.");

     }

}
public class Circle implements Shape {

     @Override
     public void draw() {
          System.out.println("Inside Circle::draw() method.");

     }

}
public interface Color {
     void fill();
}
public class Blue implements Color {

     @Override
     public void fill() {
          System.out.println("Inside Blue::fill() method.");

     }

}

public class Green implements Color {

     @Override
     public void fill() {
          System.out.println("Inside Green::fill() method.");

     }

}
public class Red implements Color {

     @Override
     public void fill() {
          System.out.println("Inside Red::fill() method.");

     }

}

یک کارخانه برای ساخت Shape و یک کارخانه برای ساخت Color داریم.کد آن به صورت زیر است:

public class ShapeFactory extends AbstractFactory {

     @Override
     Color getColor(String color) {
          return null;
     }

     @Override
     Shape getShape(String shape) {
         if(shape == null){
              return null;
           }      

           if(shape.equalsIgnoreCase("CIRCLE")){
              return new Circle();

           }else if(shape.equalsIgnoreCase("RECTANGLE")){
              return new Rectangle();

           }else if(shape.equalsIgnoreCase("SQUARE")){
              return new Square();
           }

           return null;
     }

}

public class ColorFactory extends AbstractFactory {

     @Override
     Color getColor(String color) {
          if (color == null) {
              return null;
          }

          if (color.equalsIgnoreCase("RED")) {
              return new Red();

          } else if (color.equalsIgnoreCase("GREEN")) {
              return new Green();

          } else if (color.equalsIgnoreCase("BLUE")) {
              return new Blue();
          }

          return null;
     }

     @Override
     Shape getShape(String shape) {
          return null;
     }

}

ساخت Abstract Factory

کدهای بالا را که زدیم برای رسیدن به این قسمت بود. این قسمت ما یک کلاس abstract میسازیم به نام Abstract Factory و در کلاس Factory Producer از آن استفاده میکنیم.کد آن به صورت زیر است:

public abstract class AbstractFactory {
     abstract Color getColor(String color);
     abstract Shape getShape(String shape);
}
public class FactoryProducer {
     public static AbstractFactory getFactory(String choice) {

          if (choice.equalsIgnoreCase("SHAPE")) {
              return new ShapeFactory();

          } else if (choice.equalsIgnoreCase("COLOR")) {
              return new ColorFactory();
          }

          return null;
     }
}

ما کارخانه ای از کارخانه های خود را ساختیم. برای تست کدهای بالا،کد main زیر را بزنید:

public static void main(String[] args) {

          AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

          Shape shape1 = shapeFactory.getShape("CIRCLE");

          shape1.draw();

          Shape shape2 = shapeFactory.getShape("RECTANGLE");

          shape2.draw();

          Shape shape3 = shapeFactory.getShape("SQUARE");

          shape3.draw();

          AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

          Color color1 = colorFactory.getColor("RED");

          color1.fill();

          Color color2 = colorFactory.getColor("Green");

          color2.fill();

          Color color3 = colorFactory.getColor("BLUE");

          color3.fill();
     }

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *