>  기사  >  백엔드 개발  >  PHP의 간단한 팩토리 패턴에 대한 간략한 토론

PHP의 간단한 팩토리 패턴에 대한 간략한 토론

青灯夜游
青灯夜游앞으로
2021-06-16 17:48:213777검색

이 기사에서는 PHP 디자인 패턴의 간단한 팩토리 패턴을 안내합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP의 간단한 팩토리 패턴에 대한 간략한 토론

간단한 팩토리부터 시작해보세요. 인터뷰든, 다른 사람의 인터뷰든, 디자인 패턴에 대해 물으면 대부분의 사람들은 팩토리 패턴을 언급합니다. 디자인 패턴 중 여러 가지 공장 관련 패턴이 가장 유명하고 널리 사용된다는 것은 의심의 여지가 없습니다. GoF 디자인 패턴은 창조적인 패턴이기도 합니다.

그러나 Simple Factory, Factory Pattern, Abstract Factory Pattern 세 가지 모드를 명확하게 설명할 수 있는 사람은 면접관에게 좋은 인상을 줄 수 있습니다. 여기에는 나를 포함한 대부분의 사람들이 디자인 패턴을 깊이 연구하기 전에는 명확하게 설명할 수 없다는 전제가 있습니다. 내가 인터뷰하러 가는 것인지, 다른 사람을 인터뷰하는 것인지. 다른 사람을 인터뷰할 때는 대략적인 개요만 제시할 수 있습니다. 면접에 갔을 때 대략적인 개요만 말씀드렸습니다. 많은 시행착오를 겪은 끝에 디자인 패턴을 심도 있게 연구하자는 생각이 떠올라서 이 시리즈를 제작하게 되었습니다. 이 간단한 팩토리에서 시작하여 디자인 패턴을 다시 깊이 연구해 봅시다.

물론 여기서는 PHP를 사용합니다.

설명

정적 팩토리라고도 불리는 단순 팩토리는 GoF 23개 디자인 패턴에 속하지 않습니다. 하지만 모든 디자인 패턴 중에서 아마도 모든 사람이 가장 이해하기 쉽다고 할 수 있으며, 이미 이 디자인 패턴을 코드에서 수없이 사용해 본 적이 있을 것입니다. 가장 간단한 코드 세그먼트부터 시작해 보겠습니다.

// Factory
class Factory
{
    public static function createProduct(string $type) : Product
    {
        $product = null;
        switch ($type) {
            case 'A':
                $product = new ProductA();
                break;
            case 'B':
                $product = new ProductB();
                break;
        }
        return $product;
    }
}

네, 핵심은 중간에 있는 간단한 스위치 코드입니다. 제품 인터페이스 구현으로 반환 값 유형을 수정했습니다.

이 코드에서는 새로운 PHP 기능인 매개변수 유형반환값 유형

제품 인터페이스 및 제품 구현

// Products
interface Product
{
    public function show();
}

class ProductA implements Product
{
    public function show()
    {
        echo 'Show ProductA';
    }
}

class ProductB implements Product
{
    public function show()
    {
        echo 'Show ProductB';
    }
}

결국 클라이언트 사용이 매우 간단해졌습니다

// Client
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();

From 위 코드는 보시다시피 실제로 우리가 전달한 문자열이나 정의한 다른 식별자를 기반으로 해당 제품(제품 개체)을 반환하는 팩토리 클래스입니다.

좀 더 시각적으로 표현하자면 저는 휴대폰을 판매하는 도매업자(클라이언트, 비즈니스 측)입니다. 휴대폰(제품)이 필요해서 Foxconn(공장)에 생산을 도와달라고 요청했습니다. 주문($type 변수)을 하고 모델을 지정했는데 폭스콘에서 해당 모델의 휴대폰을 주시고 계속해서 작업을 해주셔서 정말 즐거웠습니다.

여기서 작성하는 보다 표준화된 방법은 모든 제품이 통합 인터페이스를 구현하고 클라이언트는 인터페이스 메서드를 균일하게 호출하는 방법만 알 수 있다는 것입니다. 표준화되지 않으면 통일된 Facade 관리를 위한 Facade 모드와 유사하게 인터페이스를 사용할 수 없고 다양한 객체를 반환할 수 없습니다.

PHP의 간단한 팩토리 패턴에 대한 간략한 토론

소스 코드 주소: Simple Factory 기본 클래스 다이어그램 구현

https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/source/simple-factory.php

시나리오: SMS 전송 기능 모듈. 이제 우리는 Alibaba Cloud, Diexin 및 Jiguang이라는 3개의 판매자의 SMS 서비스를 사용합니다. Simple Factory를 사용하면 다양한 SMS 발신자를 쉽게 충족할 수 있습니다.

클래스 다이어그램:

PHP의 간단한 팩토리 패턴에 대한 간략한 토론

코드:

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;阿里云短信(原阿里大鱼)发送成功!短信内容:&#39; . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;百度SMS短信发送成功!短信内容:&#39; . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;极光短信发送成功!短信内容:&#39; . $msg;
    }
}

Class MessageFactory {
    public static function createFactory($type){
        switch($type){
            case &#39;Ali&#39;:
                return new AliYunMessage();
            case &#39;BD&#39;:
                return new BaiduYunMessage();
            case &#39;JG&#39;:
                return new JiguangMessage();
            default:
                return null;
        }
    }
}

// 当前业务需要使用极光
$message = MessageFactory::createMessage(&#39;Ali&#39;);
echo $message->send(&#39;您有新的短消息,请查收&#39;);

소스 코드 주소: Simple Factory 인스턴스-SMS 전송 공장

https://github.com/zhangyue0503/designpatterns-php/blob/master / 01.simple-factory/source/simple-factory-message.php

Description

  • 메시지를 생성할 때 정적을 사용해야 하나요? 꼭 그런 것은 아니지만 비즈니스 상황에 따라 다릅니다. 상주해야 하는 모든 정적 항목과 요청 시 인스턴스화되는 정적 항목은 새 것일 수도 있고 정상일 수도 있습니다. -> 세 가지 메시지 하위 클래스를 호출하려면 인터페이스를 구현해야 합니까? 반드시 그런 것은 아닙니다. PHP 자체는 약한 유형의 언어이므로 강제할 필요가 없습니다. 그러나 인터페이스 사용은 객체 지향 사양에 더 가깝습니다(
  • 다형성
  • 을 참조하세요). 그리고 다형성 적용 메시지 전송을 위한 채널을 추가해야 하는 경우 메시지 인터페이스를 상속할 새 클래스를 추가하고, send() 메서드를 구현하고, MessageFactory()의 createFactory() 메서드에서 스위치를 수정하세요
  • 위의 수정 사항이 어떤 객체 지향 원칙을 위반하는지 생각해 보세요. (팁: XX를 열어보세요)
  • 인스턴스에서는 반환값 형식이 사용되지 않나요? 이것도 새로운 구문이므로 이전 버전과의 호환성을 위해 작성할 필요는 없습니다. 그러나 회사의 기술 스택이 7 이상으로 업그레이드된 경우 이 디자인 패턴 아키텍처 클래스의 코드를 작성하는 것이 좋습니다. 위에서 설명한 새로운 기능에 따라 작성되었습니다. 즉, 매개변수 유형과 반환 값 유형을 사용하면 사양과 더 일치하고 이해하기 쉽습니다. $type이 잘못 전달되어 인스턴스에서 NULL을 반환하는 경우 어떻게 해야 합니까? 님, 실제로 코드를 작성할 때 이 문제를 잘 처리해 주시기 바랍니다. 물론, 문제가 없다면 클라이언트가 미리 판단하는 것이 가장 좋습니다. Factory
  • 추천 학습: "
  • PHP 비디오 튜토리얼
  • "

위 내용은 PHP의 간단한 팩토리 패턴에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제