반응형

Design Pattern - Abstract Factory Pattern


(원문 위치 : http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm )

추상 팩토리 패턴은 다른 팩토리들을 생성하는 수퍼 팩토리를 피하며 일한다. 이 팩토리는 팩토리의 팩토리로써 불리어진다. 이 디자인 패턴 형태는 이 패턴이 객체를 생성하는 좋은 방법중 하나를 제공하므로 생성적 패턴에 포함된다.

추상 팩토리 패턴에서 인터페이스는 명시적으로 클래스를 구체화하는 것 없이 객체와 관련된 팩토리를 생성할 책임을 갖는다. 생성된 각 팩토리는 팩토리 패턴에 따라 객체를 줄 수 있다.

Implementation

Shape와 Color 인터페이스를 생성하고 이 인터페이스를 구현하는 클래스를 구체화한다. 다음단계로 추상 팩토리 클래스 AbstractFactory를 생성한다. 팩토리 클래스 ShapeFactory와 ColorFactory는 AbstractFactory를 확장한 각 팩토리에 정의된다. 팩토리 creator/generator 클래스 FactoryProducer는 생성되어 진다.

AbstractFactoryPatternDemo, 데모 클래스는 AbstractFactory객체를 얻기위해 FactoryProducer를 사용한다. 이것은 필요한 객체의 타입을 얻기위해 AbstractFactory에 정보(모양을 위한 CIRCLE/RECTANGLE/SQUARE)를 전달할 것이다. 또한 필요한 객체의 타입을 얻기위해 AbstractFactory에 정보(색을 위한 RED/GREEN/BLUE)를 전달한다.
Abstract Factory Pattern UML Diagram

Step 1

Shapes를 위한 인터페이스를 생성한다.

Shape.java

public interface Shape {
   void draw();
}

Step 2

동일 인터페이스를 구현하는 구체적인 클래스를 생성한다.

Rectangle.java

public class Rectangle implements Shape {

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

Square.java

public class Square implements Shape {

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

Circle.java

public class Circle implements Shape {

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

Step 3

Colors를 위한 인터페이스를 생성한다.

Color.java

public interface Color {
   void fill();
}

Step4

동일 인텊이스를 구현하는 구체적인 클래스를 생성한다.

Red.java

public class Red implements Color {

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

Green.java

public class Green implements Color {

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

Blue.java

public class Blue implements Color {

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

Step 5

Color와 Shape 객체를 위한 팩토리를 얻기 위한 추상 클래스를 생성한다.

AbstractFactory.java

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

Step 6

주어진 정보를 바탕으로 구체적인 클래스의 객체를 생성하기 위한 AbstractFactory를 확장하는 팩토리 클래스를 생성한다.

ShapeFactory.java

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

ColorFactory.java

public class ColorFactory extends AbstractFactory {
	
   @Override
   public Shape getShape(String shapeType){
      return null;
   }
   
   @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;
   }
}

Step 7

Shape 또는 Color같은 정보를 전달하는 것으로 팩토리를 얻기 위한 팩토리 generator/producer 클래스를 생성한다.

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;
   }
}

Step 8

type같은 정로블 전달하는 것으로 구체적인 클래스의 팩토리를 얻기 위한 AbstractFactory를 얻는 FactoryProducer를 사용한다.

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {

      //get shape factory
      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

      //get an object of Shape Circle
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //call draw method of Shape Circle
      shape1.draw();

      //get an object of Shape Rectangle
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //call draw method of Shape Rectangle
      shape2.draw();
      
      //get an object of Shape Square 
      Shape shape3 = shapeFactory.getShape("SQUARE");

      //call draw method of Shape Square
      shape3.draw();

      //get color factory
      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

      //get an object of Color Red
      Color color1 = colorFactory.getColor("RED");

      //call fill method of Red
      color1.fill();

      //get an object of Color Green
      Color color2 = colorFactory.getColor("Green");

      //call fill method of Green
      color2.fill();

      //get an object of Color Blue
      Color color3 = colorFactory.getColor("BLUE");

      //call fill method of Color Blue
      color3.fill();
   }
}

Step 9

결과를 확인한다.

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.


반응형

+ Recent posts