ホームページ >バックエンド開発 >PHPチュートリアル >PHP のファクトリー メソッド パターンに関する簡単な説明
この記事では、PHP デザイン パターンのファクトリ メソッド パターンについて説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
前回述べたように、単純な工場は GoF の 23 の設計パターンに属しません。今回は本物の、有名な 工場です。メソッドパターンがレポートに来ます!
関連する推奨事項: 「 PHP の単純なファクトリ パターンについての簡単な説明 」
単純なファクトリと比較して、ファクトリ メソッド パターンの中核となるのは、実装をサブクラスに延期することです。どのように理解すればよいでしょうか?前回の単純なファクトリを親クラスとして使用し、それを多数のサブクラスに継承させることができます。 createProduct() メソッドも、親クラスの抽象メソッドになります。そうすれば、すべてのサブクラスがこのメソッドを実装します。switch を使用して判断する必要はなくなり、サブクラスはインスタンス化されたオブジェクトを直接返すことができます。
GoF 定義: オブジェクトを作成するためのインターフェイスを定義し、どのクラスをインスタンス化するかをサブクラスに決定させます。ファクトリ メソッドは、クラスのインスタンス化をそのサブクラスに延期します。
GoF クラス図:
コード実装
最初は製品関連のインターフェイスと実装クラスで、単純なファクトリのインターフェイスと実装クラスに似ています:// 商品接口 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 送信クラス図
コード実装<?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;
}
}
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('您有新的短消息,请查收');
##https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory-message.php#説明
クラス図と完全に一致していますので、基本的に説明の必要はありません ファクトリメソッドパターンの特徴に注目して実装してくださいサブクラスに延期されました! !
ビジネスに電話をかけるときは、Factory サブクラスを結合する必要があります。これはまさにその通りです。呼び出し先を統一したい場合は、外部に単純なファクトリーを追加してください。これは検討すべき問題です。以上がPHP のファクトリー メソッド パターンに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。