Tasarım Deseni - Soyut Fabrika Modeli

Özet Fabrika kalıpları, diğer fabrikaları yaratan bir süper fabrika etrafında çalışır. Bu fabrika aynı zamanda fabrika fabrikası olarak da adlandırılır. Bu desen türü, bir nesneyi yaratmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal modelin kapsamına girer.

Abstract Factory modelinde bir arayüz, sınıflarını açıkça belirtmeden ilgili nesnelerin bir fabrikasını oluşturmaktan sorumludur. Üretilen her fabrika, nesneleri Fabrika modeline göre verebilir.

Uygulama

Bir Shape arayüzü ve onu uygulayan somut bir sınıf oluşturacağız. Bir sonraki adım olarak AbstractFactory soyut fabrika sınıfı oluşturuyoruz. AbstractFactory'yi genişleten fabrika sınıfı ShapeFactory tanımlanmıştır. Bir fabrika yaratıcısı / üretici sınıfı FactoryProducer oluşturulur.

AbstractFactoryPatternDemo, demo sınıfımız bir AbstractFactory nesnesi almak için FactoryProducer'ı kullanır. İhtiyaç duyduğu nesne türünü elde etmek için AbstractFactory'ye bilgileri (ÇEMBER / DİKDÖRTGEN / KARE) geçirecektir.

Aşama 1

Şekiller için bir arayüz oluşturun.

Shape.java

public interface Shape {
   void draw();
}

Adım 2

Aynı arayüzü uygulayan somut sınıflar oluşturun.

RoundedRectangle.java

public class RoundedRectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside RoundedRectangle::draw() method.");
   }
}

RoundedSquare.java

public class RoundedSquare implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside RoundedSquare::draw() method.");
   }
}

Rectangle.java

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

Aşama 3

Normal ve Yuvarlak Şekilli Nesneler için fabrikalar elde etmek üzere bir Soyut sınıf oluşturun.

AbstractFactory.java

public abstract class AbstractFactory {
   abstract Shape getShape(String shapeType) ;
}

4. adım

AbstractFactory'yi verilen bilgilere göre somut sınıf nesnesi oluşturmak için genişleten Fabrika sınıfları oluşturun.

ShapeFactory.java

public class ShapeFactory extends AbstractFactory {
   @Override
   public Shape getShape(String shapeType){    
      if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }	 
      return null;
   }
}

RoundedShapeFactory.java

public class RoundedShapeFactory extends AbstractFactory {
   @Override
   public Shape getShape(String shapeType){    
      if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new RoundedRectangle();         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new RoundedSquare();
      }	 
      return null;
   }
}

Adım 5

Shape gibi bir bilgiyi ileterek fabrikaları elde etmek için bir Fabrika oluşturucu / üretici sınıfı oluşturun

FactoryProducer.java

public class FactoryProducer {
   public static AbstractFactory getFactory(boolean rounded){   
      if(rounded){
         return new RoundedShapeFactory();         
      }else{
         return new ShapeFactory();
      }
   }
}

6. Adım

Type gibi bir bilgiyi ileterek somut sınıfların fabrikalarını elde etmek için AbstractFactory'yi almak için FactoryProducer'ı kullanın.

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {
      //get shape factory
      AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
      //get an object of Shape Rectangle
      Shape shape1 = shapeFactory.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape1.draw();
      //get an object of Shape Square 
      Shape shape2 = shapeFactory.getShape("SQUARE");
      //call draw method of Shape Square
      shape2.draw();
      //get shape factory
      AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
      //get an object of Shape Rectangle
      Shape shape3 = shapeFactory1.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape3.draw();
      //get an object of Shape Square 
      Shape shape4 = shapeFactory1.getShape("SQUARE");
      //call draw method of Shape Square
      shape4.draw();
      
   }
}

7. Adım

Çıkışı doğrulayın.

Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.