ホームページ >バックエンド開発 >PHPチュートリアル >PHP のファクトリー メソッド パターンに関する簡単な説明

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

青灯夜游
青灯夜游転載
2021-06-17 18:21:122552ブラウズ

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

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

前回述べたように、単純な工場は GoF の 23 の設計パターンに属しません。今回は本物の、有名な 工場です。メソッドパターンがレポートに来ます!

関連する推奨事項: 「 PHP の単純なファクトリ パターンについての簡単な説明

GoF クラス図の説明

単純なファクトリと比較して、ファクトリ メソッド パターンの中核となるのは、実装をサブクラスに延期することです。どのように理解すればよいでしょうか?前回の単純なファクトリを親クラスとして使用し、それを多数のサブクラスに継承させることができます。 createProduct() メソッドも、親クラスの抽象メソッドになります。そうすれば、すべてのサブクラスがこのメソッドを実装します。switch を使用して判断する必要はなくなり、サブクラスはインスタンス化されたオブジェクトを直接返すことができます。

GoF 定義: オブジェクトを作成するためのインターフェイスを定義し、どのクラスをインスタンス化するかをサブクラスに決定させます。ファクトリ メソッドは、クラスのインスタンス化をそのサブクラスに延期します。

GoF クラス図:

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

    ##クラス図内の Product は product
  • です。
  • クラス図のCreatorは作成者です
  • 作成者の親クラスには抽象FactoryMethod()ファクトリメソッドがあります
  • すべての作成者のサブクラスはこのファクトリメソッドを実装し、対応する特定の製品を返す必要があります
  • 作成者の親クラスは、製品を直接返す AnOperation() 操作メソッドを持つことができます。FactoryMethod() を使用して返すことができるため、外部は統一された方法で AnOperation() を呼び出すだけで済みます

コード実装

最初は製品関連のインターフェイスと実装クラスで、単純なファクトリのインターフェイスと実装クラスに似ています:

// 商品接口
interface Product{
    function show() : void;
}

// 商品实现类A
class ConcreteProductA implements Product{
    public function show() : void{
        echo "I'm A.\n";
    }
}

次は作成者の抽象クラスと実装クラスです:

// 创建者抽象类
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();
    }
}

これは単純なファクトリとは根本的に異なります。不快なスイッチを削除し、それぞれの特定の実装クラスに製品オブジェクトを作成させます。そうです、単一かつクローズドです。個々の Creator サブクラスは、ファクトリ メソッドで 1 つのプロダクトにのみ結合されます。このサブクラスに顧客と協力した他のプロダクトや他のファクトリがあるかどうかはわかりません。

再び携帯電話のたとえを使用してみましょう: 私は携帯電話を販売する卸売業者 (クライアント、ビジネス側) です。携帯電話 (製品 A) のバッチが必要なので、Foxconn を入手しに行きました。 ( Factory Creator) が制作を手伝ってくれました。 Foxconn に私のニーズを説明したところ、Foxconn は私の衡陽工場 (ConcreteCreatorA) で対応することに同意しました。本社工場に行く必要はありません。少量の注文はただの無駄です。それからしばらくして、別のモデルの携帯電話 (製品 B) が必要になり、フォックスコンがそれを見て、鄭州フォックスコン (コンクリート クリエーター B) に製造の協力を依頼しました。とにかく、何があっても、必ず対応する携帯電話をくれました。さらに、鄭州工場は衡陽工場が何を生産したか、私に協力したかどうかを知りません、これらすべてを知っているのは私と本社工場だけです。

完全なコード: ファクトリ メソッド パターン

https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory。 php

シナリオ: トリックを練習せずに話すだけで、最後のテキスト メッセージを送信して変更します。最後のテキスト メッセージを引き続き使用します。 複数の SMS 送信者。結局のところ、誰もがすでに慣れ親しんでいますが、将来的には置き換える必要があるかもしれません。ショッピングモールは戦場のようなものであり、全員の利益が最優先されるべきです。この場合、ファクトリ メソッド パターンを通じてそれを分離でき、SMS プロバイダーを簡単に追加および変更できます。

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;
    }
}


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(&#39;您有新的短消息,请查收&#39;);

完了ソース コード: SMS 送信ファクトリ メソッド
##https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory-message.php

#説明

クラス図と完全に一致していますので、基本的に説明の必要はありません ファクトリメソッドパターンの特徴に注目して実装してくださいサブクラスに延期されました! !

ビジネスに電話をかけるときは、Factory サブクラスを結合する必要があります。これはまさにその通りです。呼び出し先を統一したい場合は、外部に単純なファクトリーを追加してください。これは検討すべき問題です。
  • 現在の形式に固執しないでください。必要はありません。抽象クラス、インターフェイスを直接使用してファクトリ メソッドを定義し、getMessage() メソッドを放棄し、パブリック テンプレート メソッド (factoryMethod) を外部から直接呼び出します。
  • 推奨学習: 「
  • PHP ビデオ チュートリアル」

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

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。