1. 의도
객체 생성을 위한 인터페이스를 정의하고 하위 클래스가 인스턴스화할 클래스를 결정하도록 합니다. 팩토리 메소드는 클래스를 사용하여 인스턴스화를 하위 클래스로 연기합니다. [GOF95]
2. 팩토리 패턴 구조도
3. 공장모드의 주인공
추상적인 제품(Product) 역할: 특정 제품 객체에 공통적인 상위 클래스 또는 인터페이스
구체적인 제품 역할: 추상 제품 역할에 의해 정의된 인터페이스를 구현하며 팩토리 메소드 패턴에 의해 생성된 각 객체는 특정 제품 객체의 인스턴스입니다
추상 팩토리(생성자) 역할: 패턴에서 객체를 생성하는 모든 팩토리 클래스는 이 인터페이스를 구현해야 합니다. 이는 Product 유형의 객체를 반환하는 팩토리 메서드를 선언합니다.
Creator는 기본 ConcreteProduct 객체를 반환하는 팩토리 메소드의 기본 구현을 정의할 수도 있습니다.
구체적인 생성자(Concrete Creator) 역할: 추상 팩토리 인터페이스를 구현합니다. 구체적인 팩토리 역할은 애플리케이션 로직과 관련되어 있으며 애플리케이션에서 직접 호출되어 제품 객체를 생성합니다.
4. 팩토리 모델의 장점과 단점
공장 모드의 장점:
팩토리 메소드 패턴을 사용하면 시스템이 팩토리 역할을 수정하지 않고도 새 제품을 출시할 수 있습니다.
팩토리 패턴의 단점:
클라이언트는 특정 ConcreteProduct 객체를 생성하기 위해 Creator 하위 클래스를 생성해야 할 수도 있습니다
5. 팩토리 모드 적용 시나리오
1. 클래스가 생성해야 하는 객체의 클래스를 모르는 경우
2. 클래스가 하위 클래스에서 자신이 생성하는 객체를 지정하기를 원하는 경우
3. 클래스가 객체 생성 책임을 여러 도우미 하위 클래스 중 하나에 위임하고 어떤 도우미 하위 클래스가 위임인지에 대한 정보를 지역화하려는 경우
6. 공장 모드 및 기타 모드
추상 팩토리 모드: 추상 팩토리 모드는 팩토리 메소드를 사용하여 구현되는 경우가 많습니다
템플릿 메소드 패턴: 팩토리 메소드는 일반적으로 템플릿 메소드에서 호출됩니다
7. 팩토리 모드 PHP 예제
<?php /** * 抽象工厂角色 */ interface Creator { public function factoryMethod(); } /** * 具体工厂角色A */ class ConcreteCreatorA implements Creator { /** * 工厂方法 返回具体 产品A * @return ConcreteProductA */ public function factoryMethod() { return new ConcreteProductA(); } } /** * 具体工厂角色B */ class ConcreteCreatorB implements Creator { /** * 工厂方法 返回具体 产品B * @return ConcreteProductB */ public function factoryMethod() { return new ConcreteProductB(); } } /** * 抽象产品角色 */ interface Product { public function operation(); } /** * 具体产品角色A */ class ConcreteProductA implements Product { /** * 接口方法实现 输出特定字符串 */ public function operation() { echo 'ConcreteProductA <br />'; } } /** * 具体产品角色B */ class ConcreteProductB implements Product { /** * 接口方法实现 输出特定字符串 */ public function operation() { echo 'ConcreteProductB <br />'; } } class Client { /** * Main program. */ public static function main() { $creatorA = new ConcreteCreatorA(); $productA = $creatorA->factoryMethod(); $productA->operation(); $creatorB = new ConcreteCreatorB(); $productB = $creatorB->factoryMethod(); $productB->operation(); } } Client::main(); ?>
8. 팩토리 메소드 패턴과 단순 팩토리 패턴을 구별하세요
팩토리 메소드 패턴과 단순 팩토리 패턴의 구조적 차이는 그다지 뚜렷하지 않습니다. 팩토리 메소드 클래스의 핵심은 추상 팩토리 클래스인 반면, 단순 팩토리 패턴은 핵심을 구체적인 클래스에 배치합니다.
팩토리 메소드 패턴에 다형성 팩토리 패턴이라는 별명이 있는 이유는 특정 팩토리 클래스가 공통 인터페이스 또는 공통 추상 상위 클래스를 갖기 때문입니다.
시스템이 확장되어 새로운 제품 개체를 추가해야 하는 경우 특정 개체와 특정 팩토리 개체만 추가하면 됩니다. 원본 팩토리 개체는 어떤 방식으로든 수정할 필요가 없으며 클라이언트를 수정할 필요도 없습니다. , 이는 원칙적으로 "개방-폐쇄" 개념과 일치합니다. 단순 팩토리 모델은 새로운 제품 객체를 추가한 후 팩토리 메소드를 수정해야 하기 때문에 확장성이 좋지 않습니다.
팩토리 메소드 패턴은 퇴보 후 간단한 팩토리 패턴으로 발전할 수 있습니다.
위는 PHP를 사용하여 팩토리 모드를 구현하는 코드입니다. 팩토리 모드에 대한 몇 가지 개념적 차이점도 있습니다. 모든 분들의 학습에 도움이 되기를 바랍니다.