PHP の単純なファクトリー パターンに関する簡単な説明

青灯夜游
リリース: 2023-04-10 08:26:01
転載
3783 人が閲覧しました

この記事では、PHP デザイン パターンの単純なファクトリ パターンについて説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHP の単純なファクトリー パターンに関する簡単な説明

まずは簡単な工場から始めましょう 面接でも他人からのインタビューでも、設計パターンについて聞かれると、ほとんどの人が工場パターンを挙げるでしょう。デザイン パターンの中で、いくつかの工場関連のパターンが最も有名で広く使用されていることは間違いありません。 GoF のデザイン パターンも創造的なパターンです。

しかし、Simple FactoryFactory PatternAbstract Factory Pattern の 3 つのモードを説明できる人は、面接官に非常に好印象を与えることができます。 。ここには、本当に明確に説明できるという前提がありますが、私を含むほとんどの人は、デザインパターンを深く学ぶ前にそれを明確に説明することはできません。私が面接に行く場合でも、他の人に面接する場合でも。他人にインタビューするとき、私は大まかな概要しか伝えることができません。面接に行ったときは、大まかな概要だけを話しました。数々の挫折を経験した結果、デザインパターンを徹底的に研究してみようと思い立ち、この連載が生まれました。この単純なファクトリーから始めて、デザインパターンをもう一度深く勉強してみましょう。

もちろん、ここでは 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;
    }
}
ログイン後にコピー

はい、核心は真ん中のシンプルなスイッチコードで、戻り値の型を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();
ログイン後にコピー

上記のコードからわかるように、実際、ここには渡した文字列に基づくファクトリ クラスがあります。またはユーザーが作成したその他の定義識別子を使用して、対応する製品 (Product オブジェクト) を返します。

より視覚的な比喩: 私は携帯電話を販売する卸売業者 (クライアント、ビジネス側) です。携帯電話 (製品) のバッチが必要なので、Foxconn (工場) に行きます。プロデュースを手伝ってもらうために。注文($type変数)してモデルを指定すると、Foxconnが対応するモデルの電話をくれて、作業を続けました。Foxconnと協力するのは本当に楽しかったです。

ここでのより標準化された書き方は、すべての製品が統一インターフェイスを実装し、クライアントはインターフェイス メソッドを統一的に呼び出す方法だけを知っているということです。標準化されていない場合、統合ファサード管理のファサード モードと同様に、インターフェイスを使用してさまざまなオブジェクトを返すことができません。

PHP の単純なファクトリー パターンに関する簡単な説明

ソース コード アドレス: シンプルなファクトリの基本クラス図の実装

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

Example

シナリオ: SMS 送信機能モジュール。現在、Alibaba Cloud、Diexin、Jiguang の 3 社の SMS サービスを使用しています。事業ごとに異なる SMS 送信者が使用されている場合があります。Simple Factory を使用すると、この要件を簡単に満たすことができます。

クラス図:

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;);
ログイン後にコピー

ソースコードアドレス : シンプル ファクトリ インスタンス - SMS 送信ファクトリー

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

イラスト

  • メッセージを作成するときは静的を使用する必要がありますか?必ずしも必要というわけではありません。ビジネスの状況によって異なります。常駐する必要があるすべての静的データと、オンデマンドでインスタンス化される静的データは、新しいものでも通常のものでもかまいません ->
  • 3 つを呼び出すインターフェイスを実装する必要がありますか?メッセージのサブクラス?必ずしもそうとは限りません。PHP 自体は弱い型指定言語であるため、強制する必要はありません。ただし、インターフェイスの使用はオブジェクト指向の仕様により準拠しています (ポリモーフィズム を参照してください)。単純なファクトリ自体式とアプリケーション
  • メッセージ送信用のチャネルを追加する必要がある場合は、Message インターフェイスを継承する新しいクラスを追加し、send() メソッドを実装し、 MessageFactory() の createFactory() メソッド
  • #考察 上記の変更はオブジェクト指向のどの原則に違反しますか? (ヒント: XX を開きます)
  • 戻り値の型がインスタンスで使用されていませんか?これも新しい構文です。古いバージョンとの互換性のために記述する必要はありません。ただし、会社のテクノロジ スタックが 7 以降にアップグレードされている場合は、このデザイン パターン アーキテクチャ クラスのコードを以下に従って記述することをお勧めします。上で説明した新機能、つまりパラメータの型と戻り値の型を変更すると、仕様との整合性が高まり、理解しやすくなります。例では NULL ですか?皆さん、実際にコードを書くときはこの問題をうまく処理してください。デフォルトまたは上位レベルのキャプチャを返すのが良い解決策です。もちろん、事前にクライアントが判断するのが最善です。問題がなければ工場に行きます。 .
  • 推奨学習: 「
PHP ビデオ チュートリアル

以上がPHP の単純なファクトリー パターンに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!