この記事では、PHP デザイン パターンの抽象ファクトリ パターンについて説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
ファクトリー パターン シリーズのハイライトは、そう、噂の Abstract Factory Pattern です。初めてその名前を聞いたときはどう思いましたか?とにかく、これは「抽象的」という言葉が入っているので、非常に高級なものでなければならないと感じています。この2つの言葉は開発において非常に高度な感覚を持っていると言われており、abstractという言葉と一緒に使うとすべてが非常に強力であるように見えます。ただし、Abstract Factory はまさにファクトリー パターンの兄貴分であると言えます。
Gof クラス図と説明
実際、ファクトリ メソッド パターンを理解していれば、抽象ファクトリ パターンを理解するのは簡単です。どのように言って?サブクラスに対する遅延は同じであり、指定されたオブジェクトの戻りも同じです。ただ、抽象ファクトリは 1 つのオブジェクトを返すだけでなく、多数のオブジェクトを返します。
GoF 定義: 特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します。
GoF クラス図:
- 左側には 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 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; } } interface Push { public function send(string $msg); } class AliYunPush implements Push{ public function send(string $msg){ // 调用接口,发送客户端推送 // xxxxx return '阿里云Android&iOS推送发送成功!推送内容:' . $msg; } } class BaiduYunPush implements Push{ public function send(string $msg){ // 调用接口,发送客户端推送 // xxxxx return '百度Android&iOS云推送发送成功!推送内容:' . $msg; } } class JiguangPush implements Push{ public function send(string $msg){ // 调用接口,发送客户端推送 // xxxxx return '极光推送发送成功!推送内容:' . $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('您已经很久没有登录过系统了,记得回来哦!'); echo $push->send('您有新的红包已到帐,请查收!');
完全なソース コード: 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 サイトの他の関連記事を参照してください。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

WebStorm Mac版
便利なJavaScript開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ホットトピック



