추상 팩터 리 패턴은 또 다른 창조 패턴입니다.
팩토리의 팩토리라고도하는 추상 팩터 리 패턴에는 다른 팩토리를 생성하는 팩토리가 있습니다.
Abstract Factory 패턴을 사용할 때는 먼저 super factory를 사용하여 factory를 만든 다음 생성 된 factory를 사용하여 객체를 만듭니다.
예제
다음 코드는 추상 팩터 리 패턴을 사용하는 방법을 보여줍니다.
모양과 프린터를 만들 계획입니다. 도형의 경우 원, 사각형 및 사각형을 사용합니다. 프린터의 경우 프린터, 웹 프린터 및 스크린 프린터 용지를 사용합니다.
모양을 위해 우리는 다음과 같이 Shape 인터페이스를 생성 할 것입니다.
interface Shape { void draw(); }
그런 다음 Shape 인터페이스를 구현하는 구체적인 클래스를 작성합니다.
class Rectangle implements Shape{ @Override public void draw() { System.out.println ( "내부 사각형 :: draw () 메서드." ); } } class Square implements Shape { @Override public void draw() { System.out.println ( "내부 사각형 :: draw () 메서드." ); } } class Circle implements Shape { @Override public void draw() { System.out.println ( "Inside Circle :: draw () 메서드." ); } }
그런 다음 프린터 용 인터페이스를 만듭니다.
interface Printer{ void print(); }
그런 다음 Printer 인터페이스를 구현하는 구체적인 클래스를 만듭니다.
class PaperPrinter implements Printer { @Override public void print() { System.out.println( "paper" ); } } class WebPrinter implements Printer { @Override public void print() { System.out.println( "web" ); } } class ScreenPrinter implements Printer { @Override public void print() { System.out.println( "screen" ); } }
마지막으로 Printer 클래스와 Shape 객체를위한 추상 클래스를 생성합니다.
abstract class AbstractFactory { abstract Printer getPrinter (String type); abstract Shape getShape(String shape); }
마지막으로 AbstractFactory를 확장 한 Factory 클래스를 작성하여 주어진 정보를 기반으로 구체적인 클래스의 객체를 생성합니다.
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 Printer getPrinter(String type) { return null; } } class PrinterFactory extends AbstractFactory{ @Override public Shape getPrinter(String shapeType) { return null; } @Override Printer getPrinter(String type) { if (type == null) { return null; } if (type.equalsIgnoreCase( "paper" )) {
return new PaperPrinter(); } else if (type.equalsIgnoreCase ( "web" )) {
return new WebPrinter(); } else if (type.equalsIgnoreCase ( "Screen" )) {
return new ScreenPrinter(); } return null; } }
Shape 또는 Printer와 같은 정보를 전달하여 팩토리를 생성하는 Factory 생성자 / 생성자 클래스를 작성하십시오.
class FactoryProducer { public static AbstractFactory getFactory (String choice) { if (choice.equalsIgnoreCase ( "SHAPE" )) { return new ShapeFactory(); } else if (choice.equalsIgnoreCase ( "Printer" )) { return new PrinterFactory(); } return null; } }
다음 코드는 추상 팩토리 패턴을 사용하는 방법을 보여줍니다.
public class Main { public static void main (String [] args) { // 모양 팩토리 가져 오기 AbstractFactory shapeFactory = FactoryProducer.getFactory( "SHAPE" ); // Shape Circle의 객체를 얻는다. Shape shape1 = shapeFactory.getShape( "CIRCLE" ); // Shape Circle의 메소드를 호출한다. shape1.draw (); // Shape Rectangle 객체를 가져옵니다. Shape shape2 = shapeFactory.getShape( "RECTANGLE" ); // Shape Rectangle의 draw 메소드를 호출한다. shape2.draw (); // Shape Square 객체 가져 오기 Shape shape3 = shapeFactory.getShape( "SQUARE" ); // Shape Square의 메소드를 호출한다. shape3.draw (); // 프린터 팩토리를 얻는다. AbstractFactory printerFactory = FactoryProducer.getFactory( "printer" ); Printer printer1 = printerFactory.getPrinter( "Paper" ); printer1.print(); Printer printer2 = printerFactory.getPrinter( "Web" );
printer2.print(); Printer printer3 = printerFactory.getPrinter( "Screen" );
printer3.print(); } }
위의 코드는 다음 결과를 생성합니다.
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
paper
web
screen
'프로그래밍 > 자바 디자인 패턴' 카테고리의 다른 글
자바 디자인 패턴 튜토리얼 - 자바 디자인 패턴 소개 (0) | 2021.04.18 |
---|---|
자바 디자인 패턴 튜토리얼 - 자바 디자인 패턴 - 팩토리 패턴 (0) | 2021.04.18 |
자바 디자인 패턴 튜토리얼 - 자바 디자인 패턴 - 싱글 톤 패턴 (0) | 2021.04.18 |
자바 디자인 패턴 튜토리얼 - 자바 디자인 패턴 - 빌더 패턴 (0) | 2021.04.18 |
자바 디자인 패턴 튜토리얼 - 자바 디자인 패턴 - 프로토 타입 패턴 (0) | 2021.04.18 |