디자인 패턴 - Abstract Factory Pattern
Table of Contents
출처 : https://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm
Abstract Factory 패턴은 다른 팩토리를 생성하는 슈퍼 팩토리를 중심으로 작동합니다. 이 공장은 공장의 공장이라고도합니다. 이 패턴은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하기 때문에 이러한 유형의 디자인 패턴은 생성 패턴에 속합니다.
Abstract Factory 패턴에서 인터페이스는 클래스를 명시적으로 지정하지 않고 관련 객체의 팩토리를 생성하는 역할을 합니다. 생성된 각 팩토리는 팩토리 패턴에 따라 객체를 제공할 수 있습니다.
Implementation
Shape 인터페이스와 이를 구현하는 구체적인 클래스를 만들 것입니다. 다음 단계로 추상 팩토리 클래스 AbstractFactory를 생성합니다. AbstractFactory를 확장하는 팩토리 클래스 ShapeFactory가 정의되어 있습니다. 팩토리 생성자/생성기 클래스 FactoryProducer가 생성됩니다.
AbstractFactoryPatternDemo, 데모 클래스는 FactoryProducer를 사용하여 AbstractFactory 객체를 가져옵니다. 필요한 객체 유형을 얻기 위해 AbstractFactory에 정보(모양의 경우 CIRCLE / RECTANGLE / SQUARE)를 전달합니다.
Step 1
Shapes에 대한 인터페이스를 만듭니다.
Shape.java
1public interface Shape {
2 void draw();
3}
Step 2
동일한 인터페이스를 구현하는 구체적인 클래스를 만듭니다.
RoundedRectangle.java
1public class RoundedRectangle implements Shape {
2 @Override
3 public void draw() {
4 System.out.println("Inside RoundedRectangle::draw() method.");
5 }
6}
RoundedSquare.java
1public class RoundedSquare implements Shape {
2 @Override
3 public void draw() {
4 System.out.println("Inside RoundedSquare::draw() method.");
5 }
6}
Rectangle.java
1public class Rectangle implements Shape {
2 @Override
3 public void draw() {
4 System.out.println("Inside Rectangle::draw() method.");
5 }
6}
Step 3
일반 및 둥근 모양 개체에 대한 공장을 가져오는 추상 클래스를 만듭니다.
AbstractFactory.java
1public abstract class AbstractFactory {
2 abstract Shape getShape(String shapeType) ;
3}
Step 4
주어진 정보를 기반으로 구체적인 클래스의 객체를 생성하기 위해 AbstractFactory를 확장하는 Factory 클래스를 생성합니다.
ShapeFactory.java
1public class ShapeFactory extends AbstractFactory {
2 @Override
3 public Shape getShape(String shapeType){
4 if(shapeType.equalsIgnoreCase("RECTANGLE")){
5 return new Rectangle();
6 }else if(shapeType.equalsIgnoreCase("SQUARE")){
7 return new Square();
8 }
9 return null;
10 }
11}
RoundedShapeFactory.java
1public class RoundedShapeFactory extends AbstractFactory {
2 @Override
3 public Shape getShape(String shapeType){
4 if(shapeType.equalsIgnoreCase("RECTANGLE")){
5 return new RoundedRectangle();
6 }else if(shapeType.equalsIgnoreCase("SQUARE")){
7 return new RoundedSquare();
8 }
9 return null;
10 }
11}
Step 5
Shape와 같은 정보를 전달하여 Factory를 얻기 위한 Factory 생성자/생산자 클래스를 만듭니다.
FactoryProducer.java
1public class FactoryProducer {
2 public static AbstractFactory getFactory(boolean rounded){
3 if(rounded){
4 return new RoundedShapeFactory();
5 }else{
6 return new ShapeFactory();
7 }
8 }
9}
Step 6
유형과 같은 정보를 전달하여 구체적인 클래스의 팩토리를 가져오기 위해 FactoryProducer를 사용하여 AbstractFactory를 가져옵니다.
AbstractFactoryPatternDemo.java
1public class AbstractFactoryPatternDemo {
2 public static void main(String[] args) {
3 //get shape factory
4 AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
5 //get an object of Shape Rectangle
6 Shape shape1 = shapeFactory.getShape("RECTANGLE");
7 //call draw method of Shape Rectangle
8 shape1.draw();
9 //get an object of Shape Square
10 Shape shape2 = shapeFactory.getShape("SQUARE");
11 //call draw method of Shape Square
12 shape2.draw();
13 //get shape factory
14 AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
15 //get an object of Shape Rectangle
16 Shape shape3 = shapeFactory1.getShape("RECTANGLE");
17 //call draw method of Shape Rectangle
18 shape3.draw();
19 //get an object of Shape Square
20 Shape shape4 = shapeFactory1.getShape("SQUARE");
21 //call draw method of Shape Square
22 shape4.draw();
23
24 }
25}
Step 7
출력을 확인합니다.
1Inside Rectangle::draw() method.
2Inside Square::draw() method.
3Inside RoundedRectangle::draw() method.
4Inside RoundedSquare::draw() method.
이 시리즈의 게시물
- Tutorial 디자인 패턴 of Java
- Tutorial 디자인 패턴 of Java
- 디자인 패턴 - Overview
- 디자인 패턴 - Overview
- 디자인 패턴 - Factory Pattern
- 디자인 패턴 - Factory Pattern
- 디자인 패턴 - Abstract Factory Pattern
- 디자인 패턴 - Abstract Factory Pattern
- 디자인 패턴 - Singleton Pattern
- 디자인 패턴 - Singleton Pattern
- 디자인 패턴 - Builder Pattern
- 디자인 패턴 - Builder Pattern
- 디자인 패턴 - Prototype Pattern
- 디자인 패턴 - Prototype Pattern
- 디자인 패턴 - Bridge Pattern
- 디자인 패턴 - Bridge Pattern
- 디자인 패턴 - Filter Pattern
- 디자인 패턴 - Filter Pattern
- 디자인 패턴 - Composite Pattern
- 디자인 패턴 - Composite Pattern
- 디자인 패턴 - Proxy Pattern
- 디자인 패턴 - Proxy Pattern
- 디자인 패턴 - Mediator Pattern
- 디자인 패턴 - Mediator Pattern
- 디자인 패턴 - Useful Resources
- 디자인 패턴 - Useful Resources