본문 바로가기

프로그래밍/자바 디자인 패턴

자바 디자인 패턴 튜토리얼 - 자바 디자인 패턴 - 추상 팩토리 패턴

반응형

추상 팩터 리 패턴은 또 다른 창조 패턴입니다.

팩토리의 팩토리라고도하는 추상 팩터 리 패턴에는 다른 팩토리를 생성하는 팩토리가 있습니다.

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

반응형