추상 공장 디자인 패턴

이것은 Gang of Four의 창작 디자인 패턴입니다.

또한 ~으로 알려진



전부

의지



혈족 또는 부양 가족을 생성하기 위한 인터페이스 제공
구체적인 클래스를 지정하지 않고 객체.

설명



실제 사례

To create a kingdom we need objects with a common theme. Elven kingdom needs an Elven king, Elven castle and Elven army whereas Orcish kingdom needs an Orcish king, Orcish castle and Orcish army. There is a dependency between the objects in the kingdom.



평범한 말로

A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.



위키백과 말한다

The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes



프로그래밍 예제

위의 왕국 예를 번역합니다. 우선 우리는 객체에 대한 몇 가지 인터페이스와 구현을 가지고 있습니다.
왕국.

public interface Castle {
  String getDescription();
}

public interface King {
  String getDescription();
}

public interface Army {
  String getDescription();
}

// Elven implementations ->
public class ElfCastle implements Castle {
  static final String DESCRIPTION = "This is the Elven castle!";
  @Override
  public String getDescription() {
    return DESCRIPTION;
  }
}
public class ElfKing implements King {
  static final String DESCRIPTION = "This is the Elven king!";
  @Override
  public String getDescription() {
    return DESCRIPTION;
  }
}
public class ElfArmy implements Army {
  static final String DESCRIPTION = "This is the Elven Army!";
  @Override
  public String getDescription() {
    return DESCRIPTION;
  }
}

// Orcish implementations similarly -> ...



그런 다음 왕국 공장에 대한 추상화 및 구현이 있습니다.

public interface KingdomFactory {
  Castle createCastle();
  King createKing();
  Army createArmy();
}

public class ElfKingdomFactory implements KingdomFactory {
  public Castle createCastle() {
    return new ElfCastle();
  }
  public King createKing() {
    return new ElfKing();
  }
  public Army createArmy() {
    return new ElfArmy();
  }
}

public class OrcKingdomFactory implements KingdomFactory {
  public Castle createCastle() {
    return new OrcCastle();
  }
  public King createKing() {
    return new OrcKing();
  }
  public Army createArmy() {
    return new OrcArmy();
  }
}


이제 우리는 관련 개체의 가족을 만들 수 있는 추상 공장을 갖게 되었습니다. 즉, Elven 왕국 공장은 Elven 성, 왕 및 군대 등을 만듭니다.

var factory = new ElfKingdomFactory();
var castle = factory.createCastle();
var king = factory.createKing();
var army = factory.createArmy();

castle.getDescription();
king.getDescription();
army.getDescription();


프로그램 출력:

This is the Elven castle!
This is the Elven king!
This is the Elven Army!


이제 우리는 다른 왕국 공장을 위한 공장을 설계할 수 있습니다. 이 예에서는 ElfKingdomFactory 또는 OrcKingdomFactory의 인스턴스 반환을 담당하는 FactoryMaker를 만들었습니다.
클라이언트는 FactoryMaker를 사용하여 원하는 콘크리트 팩토리를 생성할 수 있으며, 이는 차례로 다양한 콘크리트 객체(Army, King, Castle)를 생성합니다.
이 예제에서는 열거형을 사용하여 클라이언트가 요청할 왕국 공장 유형을 매개변수화했습니다.

public static class FactoryMaker {

  public enum KingdomType {
    ELF, ORC
  }

  public static KingdomFactory makeFactory(KingdomType type) {
    switch (type) {
      case ELF:
        return new ElfKingdomFactory();
      case ORC:
        return new OrcKingdomFactory();
      default:
        throw new IllegalArgumentException("KingdomType not supported.");
    }
  }
}

public static void main(String[] args) {
  var app = new App();

  LOGGER.info("Elf Kingdom");
  app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF));
  LOGGER.info(app.getArmy().getDescription());
  LOGGER.info(app.getCastle().getDescription());
  LOGGER.info(app.getKing().getDescription());

  LOGGER.info("Orc Kingdom");
  app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC));
  -- similar use of the orc factory
}


클래스 다이어그램





적용 가능성



다음과 같은 경우 추상 팩토리 패턴을 사용하십시오.
  • 시스템은 제품이 생성, 구성 및 표시되는 방식과 독립적이어야 합니다
  • .
  • 시스템은 여러 제품군 중 하나로 구성되어야 합니다
  • .
  • 관련 제품 개체의 제품군은 함께 사용하도록 설계되었으며 이 제약 조건을 적용해야 합니다
  • .
  • 제품의 클래스 라이브러리를 제공하고 구현이 아닌 인터페이스만 표시하려고 합니다
  • .
  • 종속성의 수명은 개념적으로 소비자의 수명보다 짧습니다.
  • 특정 종속성을 구성하려면 런타임 값이 필요합니다
  • .
  • 런타임 시 제품군에서 호출할 제품을 결정하려고 합니다.
  • 종속성을 해결하려면 런타임에만 알려진 하나 이상의 매개 변수를 제공해야 합니다.
  • 제품 간 일관성이 필요할 때
  • 새 제품이나 제품군을 프로그램에 추가할 때 기존 코드를 변경하고 싶지 않습니다.

  • 사용 사례 예
  • 런타임에 FileSystemAcmeService, DatabaseAcmeService 또는 NetworkAcmeService의 적절한 구현을 호출하도록 선택합니다.
  • 단위 테스트 사례 작성이 훨씬 쉬워짐
  • 다양한 OS용 UI 도구

  • 결과:


  • Java의 종속성 주입은 컴파일 시간에 포착되었을 수 있는 런타임 오류로 이어질 수 있는 서비스 클래스 종속성을 숨깁니다.
  • 미리 정의된 개체를 만들 때 패턴이 훌륭하지만 새 개체를 추가하는 것이 어려울 수 있습니다.
  • 패턴과 함께 많은 새 인터페이스와 클래스가 도입되기 때문에 코드가 예상보다 복잡해집니다.

  • 지도 시간



  • Abstract Factory Pattern Tutorial

  • 알려진 용도


  • javax.xml.parsers.DocumentBuilderFactory
  • javax.xml.transform.TransformerFactory
  • javax.xml.xpath.XPathFactory

  • 관련 패턴


  • Factory Method
  • Factory Kit

  • 학점


  • Design Patterns: Elements of Reusable Object-Oriented Software
  • Head First Design Patterns: A Brain-Friendly Guide



  • 코드를 찾을 수 있습니다here.

    에서 더 많은 디자인 패턴에 대해 알아보십시오.

    Credit to Original Authors of this post:

    좋은 웹페이지 즐겨찾기