추상 팩토리 패턴은 동일한 테마를 가진 별도의 팩토리 집합을 캡슐화하는 방법을 제공하는 생성 패턴입니다. 그 본질은 "이러한 개체의 특정 클래스를 지정하지 않고 일련의 관련되거나 독립적인 개체를 생성할 수 있는 인터페이스를 제공"하는 것입니다.
추상 팩토리 패턴은 구체적인 클래스를 지정하지 않고 시스템 관련 객체 또는 상호 의존 객체를 생성하기 위한 인터페이스를 제공합니다.
추상 팩토리 패턴의 주요 역할
추상 팩토리 역할: 추상적인 제품 개체를 생성하기 위한 인터페이스를 선언합니다
콘크리트 팩토리 역할: 제품 개체에 대한 생성 작업 구현
추상 제품 역할: 제품 유형의 인터페이스를 선언합니다.
구체적 제품 역할: 추상 제품 역할에 의해 정의된 인터페이스를 구현합니다.
이는 팩토리 메소드 모델과 유사합니다. 우리는 더 이상 버거 하나만을 원하지 않고, 버거 4개와 치킨 윙 2개를 원합니다. 우리는 여전히 웨이터가 특정 공장에 속해 있다고 말합니다. 추상적인 제품은 우리가 말하는 특정 제품입니다. 웨이터가 음식을 요청했습니다.
적용성
시스템이 제품과 독립적으로 생성, 조립 및 표현되는 경우.
시스템이 여러 제품군 중 하나로 구성되는 경우.
공동 사용을 위해 일련의 관련 제품 개체의 디자인을 강조해야 할 때.
제품 클래스 라이브러리를 제공하고 구현보다는 인터페이스만 표시하려고 합니다.
클래스 다이어그램
인스턴스
<?php class Button{} class Border{} class MacButton extends Button{} class WinButton extends Button{} class MacBorder extends Border{} class WinBorder extends Border{} interface AbstractFactory { public function CreateButton(); public function CreateBorder(); } class MacFactory implements AbstractFactory{ public function CreateButton(){ return new MacButton(); } public function CreateBorder(){ return new MacBorder(); } } class WinFactory implements AbstractFactory{ public function CreateButton(){ return new WinButton(); } public function CreateBorder(){ return new WinBorder(); } } ?>
이 예에서 팩토리 클래스는 일련의 팩토리 메소드를 구현합니다. 새 기능을 추가하려는 경우 새 인터페이스를 추가하고 기존 팩토리 클래스를 수정하지 않고 새 팩토리 클래스가 이 인터페이스를 구현하도록 할 수 있습니다.
장단점
장점
특정 클래스를 분리
제품군 추가 및 교체가 용이
제품에 좋음 일관성
단점
신제품 지원이 어렵다. 이는 AbstractFactory 인터페이스가 생성될 수 있는 제품 컬렉션을 결정하기 때문입니다. 새로운 유형의 제품을 지원하려면 팩토리 액세스 인터페이스를 확장해야 하며, 이로 인해 AbstractFactory 클래스와 모든 하위 클래스가 변경됩니다.