추상 팩토리 패턴(Abstract Factory)은 일반적인 소프트웨어 설계 패턴입니다. 이 패턴은 제품군에 대한 통합 생성 인터페이스를 제공합니다. 이 제품군의 특정 시리즈가 필요한 경우 이 제품군 시리즈에 대해 특정 팩토리 클래스를 생성할 수 있습니다.
1. 의도
추상 팩토리 패턴은 구체적인 클래스를 지정하지 않고 시스템 관련 또는 상호 의존적인 객체를 생성하기 위한 인터페이스를 제공합니다. [GOF95]
2. 추상 팩토리 패턴 구조 다이어그램
3. 추상 팩토리 패턴의 주요 역할
추상 팩토리 역할: 추상 제품 객체를 생성하기 위한 인터페이스를 선언합니다. 일반적으로 인터페이스 또는 추상 클래스로 구현되는 모든 구체적인 팩토리 클래스는 이 인터페이스를 구현하거나 이 클래스를 상속해야 합니다.
콘크리트 팩토리 역할: 제품 객체를 생성하는 작업을 구현합니다. 클라이언트는 이 역할을 직접 호출하여 제품의 인스턴스를 생성합니다. 이 역할에는 적절한 제품 개체를 선택하기 위한 논리가 포함되어 있습니다. 일반적으로 구체적인 클래스를 사용하여 구현됩니다.
추상적인 제품 역할: 제품 유형의 인터페이스를 선언합니다. 이는 팩토리 메소드 패턴에 의해 생성된 객체의 상위 클래스이거나 공유하는 인터페이스입니다.
구체적인 제품 역할: 추상적인 제품 역할에 의해 정의된 인터페이스를 구현하고 해당하는 구체적인 팩토리에서 생성될 제품 개체를 정의합니다. 여기에는 애플리케이션의 비즈니스 로직이 포함됩니다.
4. 추상 팩토리 패턴의 장점과 단점
추상 팩토리 패턴의 장점:
1. 특정 수업을 분리
2. 제품군 추가 및 교체가 쉬워집니다
3. 제품 일관성에 도움이 됩니다
추상 팩토리 패턴의 단점: 새로운 유형의 제품을 지원하기가 어렵습니다. 이는 AbstractFactory 인터페이스가 생성될 수 있는 제품 컬렉션을 결정하기 때문입니다. 새로운 유형의 제품을 지원하려면 팩토리 액세스 인터페이스를 확장해야 하며, 이로 인해 AbstractFactory 클래스와 모든 하위 클래스가 변경됩니다.
추상 팩토리는 비스듬한 방식으로 신제품 추가를 지원하지만, 신제품 계층 구조 추가에는 이러한 편의성을 제공하지 못합니다.
5. 추상 팩토리 패턴 적용 시나리오
추상 팩토리 패턴은 다음과 같은 상황에서 사용해야 합니다.
1. 시스템은 제품 클래스 인스턴스가 생성, 결합 및 표현되는 방식에 대한 세부 사항에 의존해서는 안 됩니다. 이는 모든 형태의 공장 패턴에 중요합니다.
2. 이 시스템의 제품에는 둘 이상의 제품군이 있으며 시스템은 제품군 중 하나의 제품만 소비합니다.
3. 동일한 제품군에 속하는 제품들은 함께 사용되며, 이러한 제약사항을 시스템 설계에 반영해야 합니다.
4. 시스템은 제품 클래스 라이브러리를 제공하며 모든 제품은 동일한 인터페이스로 나타나므로 클라이언트 사용은 구현에 의존하지 않습니다
6. 추상 팩토리 패턴 및 기타 패턴
싱글턴 모드: 특정 팩토리 클래스는 일반적으로 하나의 팩토리로 충분하므로 특정 팩토리 하위 클래스는 일반적으로 싱글톤으로 구현됩니다.
팩토리 메소드 패턴(Factory Method Pattern) : 추상적인 팩토리에서 제품을 생성하는 방식을 팩토리 메소드(Factory Method)라고 정의합니다.
프로토타입 모드(prototype mode) : 가능한 제품 시리즈가 여러 개인 경우 특정 공장에서도 프로토타입 모드를 사용할 수 있고, 특정 공장에서는 해당 제품 시리즈를 사용한다
각 제품 프로토타입은 인스턴스화되고 프로토타입을 복사하여 새로운 제품이 생성됩니다.
7. 추상 팩토리 패턴 PHP 예제
<?php /** * 抽象工厂 */ interface AbstractFactory { /** * 创建等级结构为A的产品的工厂方法 */ public function createProductA(); /** * 创建等级结构为B的产品的工厂方法 */ public function createProductB(); } /** * 具体工厂1 */ class ConcreteFactory1 implements AbstractFactory{ public function createProductA() { return new ProductA1(); } public function createProductB() { return new ProductB1(); } } /** * 具体工厂2 */ class ConcreteFactory2 implements AbstractFactory{ public function createProductA() { return new ProductA2(); } public function createProductB() { return new ProductB2(); } } /** * 抽象产品A */ interface AbstractProductA { /** * 取得产品名 */ public function getName(); } /** * 抽象产品B */ interface AbstractProductB { /** * 取得产品名 */ public function getName(); } /** * 具体产品A1 */ class ProductA1 implements AbstractProductA { private $_name; public function __construct() { $this->_name = 'product A1'; } public function getName() { return $this->_name; } } /** * 具体产品A2 */ class ProductA2 implements AbstractProductA { private $_name; public function __construct() { $this->_name = 'product A2'; } public function getName() { return $this->_name; } } /** * 具体产品B1 */ class ProductB1 implements AbstractProductB { private $_name; public function __construct() { $this->_name = 'product B1'; } public function getName() { return $this->_name; } } /** * 具体产品B2 */ class ProductB2 implements AbstractProductB { private $_name; public function __construct() { $this->_name = 'product B2'; } public function getName() { return $this->_name; } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { self::run(new ConcreteFactory1()); self::run(new ConcreteFactory2()); } /** * 调用工厂实例生成产品,输出产品名 * @param $factory AbstractFactory 工厂实例 */ public static function run(AbstractFactory $factory) { $productA = $factory->createProductA(); $productB = $factory->createProductB(); echo $productA->getName(), '<br />'; echo $productB->getName(), '<br />'; } } Client::main(); ?>
위는 추상 팩토리 패턴을 구현하기 위해 PHP를 사용하는 코드입니다. 또한 추상 팩토리 패턴에 대한 몇 가지 개념적 차이가 있어 모든 사람의 학습에 도움이 되기를 바랍니다.