이 기사에서는 PHP 디자인 패턴의 팩토리 메소드 패턴을 안내합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
저번에 언급했듯이 Simple Factory는 GoF의 23가지 디자인 패턴에 속하지 않습니다. 이번에는 그 유명한 Factory Method Pattern을 소개합니다!
간단한 팩토리에 비해 팩토리 메소드 패턴의 핵심은 서브클래스까지 구현. 그것을 이해하는 방법? 지난 시간의 간단한 팩토리를 상위 클래스로 사용한 다음 여러 하위 클래스가 이를 상속하도록 할 수 있습니다. createProduct() 메서드도 상위 클래스의 추상 메서드가 됩니다. 그러면 모든 하위 클래스가 이 메서드를 구현합니다. 하위 클래스는 인스턴스화된 개체를 직접 반환할 수 있습니다.
GoF 정의: 객체 생성을 위한 인터페이스를 정의하고 하위 클래스가 인스턴스화할 클래스를 결정하도록 합니다. 팩토리 메소드를 사용하면 클래스 인스턴스화를 하위 클래스로 연기할 수 있습니다.
GoF 클래스 다이어그램:
코드 구현
첫 번째는 간단한 팩토리와 유사한 제품 관련 인터페이스 및 구현 클래스입니다.
// 商品接口 interface Product{ function show() : void; } // 商品实现类A class ConcreteProductA implements Product{ public function show() : void{ echo "I'm A.\n"; } }
다음은 추상 및 구현 클래스입니다. the creator:
// 创建者抽象类 abstract class Creator{ // 抽象工厂方法 abstract protected function FactoryMethod() : Product; // 操作方法 public function AnOperation() : Product{ return $this->FactoryMethod(); } } // 创建者实现类A class ConcreteCreatorA extends Creator{ // 实现操作方法 protected function FactoryMethod() : Product{ return new ConcreteProductA(); } }
간단한 팩토리와 같습니다. 근본적인 차이점을 이해하기 위해 역겨운 스위치를 제거하고 각 특정 구현 클래스에서 제품 개체를 생성하도록 했습니다. 맞습니다, 단일 및 폐쇄형입니다. 각 개별 생성자 하위 클래스는 팩토리 방식으로 하나의 제품에만 연결됩니다. 이 하위 클래스에서 고객과 협력한 다른 제품 및 다른 공장이 있는지는 알 수 없습니다.
휴대폰에 비유해 보세요. 저는 휴대폰을 판매하는 도매업자(클라이언트, 비즈니스 측)이고, 휴대폰(제품 A)이 필요해서 Foxconn(Factory Creator)에게 생산을 도와달라고 요청했습니다. . 나는 Foxconn에 내 요구 사항을 설명했고 Foxconn은 그것을 내 Hengyang 공장(ConcreteCreatorA)에서 처리하도록 동의했습니다. 귀하의 소액 주문은 낭비일 뿐입니다. 그러다가 얼마 후 다른 모델의 휴대폰(제품B)이 필요하게 되었는데, 폭스콘에서 이를 보고 정저우 폭스콘(콘크리트 크리에이터 B)에게 제작을 도와달라고 요청했습니다. 어쨌든 그들은 항상 나에게 해당 휴대폰을주었습니다. 더욱이 정저우 공장은 헝양 공장이 무엇을 생산했는지, 나와 협력했는지조차 알지 못한다.
전체 코드: 팩토리 메소드 패턴
https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory.php
장면: 빛 가짜 트릭을 연습하지 않고 지난번 SMS 전송을 수정하지 않으면 지난번과 동일한 SMS 전송 공급자를 계속 사용하게 됩니다. 결국 이미 모두가 익숙하지만 앞으로는 교체가 필요할 수도 있다. 쇼핑몰은 전쟁터와 같아서 모두의 이익이 우선되어야 한다. 이 경우 팩토리 메소드 패턴을 통해 분리할 수 있으며, SMS 공급자를 쉽게 추가하고 수정할 수 있습니다.
SMS 전송 클래스 다이어그램
코드 구현
<?php interface Message { public function send(string $msg); } class AliYunMessage implements Message{ public function send(string $msg){ // 调用接口,发送短信 // xxxxx return '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg; } } class BaiduYunMessage implements Message{ public function send(string $msg){ // 调用接口,发送短信 // xxxxx return '百度SMS短信发送成功!短信内容:' . $msg; } } class JiguangMessage implements Message{ public function send(string $msg){ // 调用接口,发送短信 // xxxxx return '极光短信发送成功!短信内容:' . $msg; } } abstract class MessageFactory{ abstract protected function factoryMethod(); public function getMessage(){ return $this->factoryMethod(); } } class AliYunFactory extends MessageFactory{ protected function factoryMethod(){ return new AliYunMessage(); } } class BaiduYunFactory extends MessageFactory{ protected function factoryMethod(){ return new BaiduYunMessage(); } } class JiguangFactory extends MessageFactory{ protected function factoryMethod(){ return new JiguangMessage(); } } // 当前业务需要使用百度云 $factory = new BaiduYunFactory(); $message = $factory->getMessage(); echo $message->send('您有新的短消息,请查收');
전체 소스 코드: SMS 전송 팩토리 메소드
https://github.com/zhangyue0503/designpatterns-php/blob/master/02 .factory/source/factory-message.php
Explanation
위 내용은 PHP의 팩토리 메소드 패턴에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!