ホームページ  >  記事  >  バックエンド開発  >  PHP の抽象ファクトリー パターンについて話しましょう

PHP の抽象ファクトリー パターンについて話しましょう

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

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

PHP の抽象ファクトリー パターンについて話しましょう

ファクトリー パターン シリーズのハイライトは、そう、噂の Abstract Factory Pattern です。初めてその名前を聞いたときはどう思いましたか?とにかく、これは「抽象的」という言葉が入っているので、非常に高級なものでなければならないと感じています。この2つの言葉は開発において非常に高度な感覚を持っていると言われており、abstractという言葉と一緒に使うとすべてが非常に強力であるように見えます。ただし、Abstract Factory はまさにファクトリー パターンの兄貴分であると言えます。

Gof クラス図と説明

実際、ファクトリ メソッド パターンを理解していれば、抽象ファクトリ パターンを理解するのは簡単です。どのように言って?サブクラスに対する遅延は同じであり、指定されたオブジェクトの戻りも同じです。ただ、抽象ファクトリは 1 つのオブジェクトを返すだけでなく、多数のオブジェクトを返します。

GoF 定義: 特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します。

GoF クラス図:

PHP の抽象ファクトリー パターンについて話しましょう

  • 左側には 2 つのファクトリー 1 と 2 があります。両方とも抽象ファクトリを継承し、CreateProductA メソッドと CreateProductB メソッドを実装します。
  • ファクトリ 1 は ProductA1 と ProductB1 を生成します
  • 同様に、ファクトリ 2 は ProductA2 と ProductB2

コードの実装

// 商品A抽象接口
interface AbstractProductA
{
    public function show(): void;
}

// 商品A1实现
class ProductA1 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA1 is Show!' . PHP_EOL;
    }
}
// 商品A2实现
class ProductA2 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA2 is Show!' . PHP_EOL;
    }
}

// 商品B抽象接口
interface AbstractProductB
{
    public function show(): void;
}
// 商品B1实现
class ProductB1 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB1 is Show!' . PHP_EOL;
    }
}
// 商品B2实现
class ProductB2 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB2 is Show!' . PHP_EOL;
    }
}

プロダクトの実装、いろいろありますが、今回は実際にはA1、A2、B1、B2という4つのプロダクトがあり、それらの間に次のような関係があるとします、A1と B1 は同様の関連製品、B1 と B2 は同様の関連製品です

// 抽象工厂接口
interface AbstractFactory
{
    // 创建商品A
    public function CreateProductA(): AbstractProductA;
    // 创建商品B
    public function CreateProductB(): AbstractProductB;
}

// 工厂1,实现商品A1和商品B1
class ConcreteFactory1 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA1();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB1();
    }
}

// 工厂2,实现商品A2和商品B2
class ConcreteFactory2 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA2();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB2();
    }
}

そして、私たちの工場は工場 1 と工場 2 でもあり、工場 1 は 2 つの関連製品、A1 と B1 を生産しています。リンクされた製品については、工場 2 が生産していますA2 と B2 の 2 つの製品。さて、ここではまだ少し抽象的であり、なぜこれが当てはまるのかまだ理解できないかもしれませんが、引き続き携帯電話の製造を例に挙げてみましょう。

弊社の携帯電話ブランドが人気になってきたので、携帯電話フィルムや携帯電話ケースなどの周辺製品をアブストラクトファクトリーさんに引き渡してお手伝いさせていただくことになりました。前回もお話しましたが、すでに数種類の携帯電話を所有しているので、前回と同様に説明していきますが、衡陽工場(Factory1)では、携帯電話モデル1001(ProductA1)を生産し、同時に携帯電話フィルム(ProductB1)とモデル 1001 携帯電話の携帯電話ケース (製品 B1)、製品 C1) も衡陽工場で生産されています。携帯電話モデル 1002 (ProductA2) はまだ鄭州工場 (Factory2) にあり、このモデルの携帯電話フィルム (ProductB2) と携帯電話フィルム (ProductC2) は鄭州工場 (Factory2) に残されます。それで、本社工場に発注したところ、携帯電話製品一式を別の工場に生産してもらい、直接販売できるようになりました。 !

完全なコード: Abstract Factory Pattern

https://github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source/ abstract-factory.php

まだ少しめまいがありますか?実際、簡単に言えば、ファクトリ クラスのさまざまなメソッドを通じてさまざまなオブジェクトを返すだけです。もう一度テキストメッセージの例を使って説明しましょう。

シナリオ: 今回は、テキスト メッセージを送信するだけでなく、プッシュ メッセージも同時に送信するというビジネス ニーズがあります。テキスト メッセージの目的は、参加できる新しいアクティビティがあることをユーザーに通知することですが、プッシュ通知はユーザーに新しいアクティビティを通知するだけでなく、直接クリックして赤い封筒を受け取ることもできます。幸いなことに、以前に選択したクラウド サービス プロバイダーはすべて 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;
    }
}

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

class AliYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;阿里云Android&iOS推送发送成功!推送内容:&#39; . $msg;
    }
}

class BaiduYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;百度Android&iOS云推送发送成功!推送内容:&#39; . $msg;
    }
}

class JiguangPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;极光推送发送成功!推送内容:&#39; . $msg;
    }
}


interface MessageFactory{
    public function createMessage();
    public function createPush();
}

class AliYunFactory implements MessageFactory{
    public function createMessage(){
        return new AliYunMessage();
    }
    public function createPush(){
        return new AliYunPush();
    }
}

class BaiduYunFactory implements MessageFactory{
    public function createMessage(){
        return new BaiduYunMessage();
    }
    public function createPush(){
        return new BaiduYunPush();
    }
}

class JiguangFactory implements MessageFactory{
    public function createMessage(){
        return new JiguangMessage();
    }
    public function createPush(){
        return new JiguangPush();
    }
}

// 当前业务需要使用阿里云
$factory = new AliYunFactory();
// $factory = new BaiduYunFactory();
// $factory = new JiguangFactory();
$message = $factory->createMessage();
$push = $factory->createPush();
echo $message->send(&#39;您已经很久没有登录过系统了,记得回来哦!&#39;);
echo $push->send(&#39;您有新的红包已到帐,请查收!&#39;);

完全なソース コード: SMS 送信ファクトリ メソッド

https : //github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source/abstract-factory-message-push.php

説明

  • とても分かりやすいでしょうか?
  • はい、2 つの製品があり、1 つは Message で、もう 1 つは Push で、それぞれメッセージの送信とプッシュ メッセージの送信に使用されます。
  • 抽象ファクトリーでは、インターフェイス実装者が 2 つの実装を行うだけで済みます。メソッドは、テキスト メッセージの送信とプッシュ メッセージの送信のオブジェクトを返します。
  • テキスト メッセージのみを送信し、プッシュ メッセージは送信しないと言えますか?もちろん可能ですが、createPush() メソッドを呼び出さないでください。
  • 抽象ファクトリはどのようなシナリオに最適ですか?明らかに、一連の関連オブジェクトの作成です。
  • ファクトリ メソッド パターンは抽象ファクトリの中核であり、製品の完全なセット (製品を含む) を生産するために大規模なファクトリに複数のファクトリ メソッドが配置されることに相当します。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHP の抽象ファクトリー パターンについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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