ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向の高度なデザイン パターン: ファクトリ パターンの使用例

PHP オブジェクト指向の高度なデザイン パターン: ファクトリ パターンの使用例

巴扎黑
巴扎黑オリジナル
2017-05-22 14:06:181585ブラウズ

私がこれまで見たオブジェクト指向プログラムで最大の switch/case ステートメントには 20 を超える条件がありました。実行時、このコード モジュールはすべての条件を毎回実行します。各条件は、アプリケーションの API の外部使用と通信するために使用される新しいオブジェクトを作成する役割を果たします。そのうちの 1 つで一般的なトラブルシューティングを実行した後、アプリケーションによって実装されているインターフェイスを調べ始めました。驚いたことに、switch/case ステートメントで参照されるすべてのクラスが同じインターフェイスを実装しています。後で switch/case ステートメントに新しい条件ステートメントを追加するときは、代わりにファクトリ パターンを使用することをお勧めします。

ファクトリーモードとは何ですか?

ファクトリ デザイン パターンは、オブジェクトの新しいインスタンスを取得するためのインターフェイスを提供すると同時に、呼び出しコードが実際に基本クラスをインスタンス化する手順を決定することを回避できるようにします。

PHP が開発され、言語に進化するにつれて、その機能は実証済みの設計パターンの適用を通じてシンプルな開発手段を提供し続けます。 PHP の特に便利な機能は、変数の内容に基づいてクラスの新しいインスタンスを作成する機能です。オブジェクトのインスタンス化のこの動的な方法は、PHP でファクトリー デザイン パターンを実装するためのコード ブロック構築アプローチです。

ファクトリーデザインのパターンベースのクラスは、メインのコードフローにおける条件ベースの複雑さを軽減するのに役立ちます。アプリケーション全体を通じて、オブジェクトはさまざまな方法で呼び出されます。オブジェクトの作成に関連する変更は、アプリケーションの残りの部分に影響します。いくつかの機能を完了するために 5 つのオブジェクトのうちの 1 つをインスタンス化するとします。どのオブジェクトをインスタンス化するかを決定する条件ステートメントを作成することも 1 つのアプローチです。条件ステートメントは、複雑な if/else ステートメントまたは switch/case ステートメントである場合があります。この機能はアプリケーション内の多くの場所で使用できますが、コードが重複します。次に、6 番目のオブジェクトが追加されるか、5 つの既存オブジェクトのうち 1 つの名前が変更される場合、プログラム コードのすべてのインスタンスを変更して再度テストする必要があります。ファクトリ デザイン パターンは、上記のオブジェクトを作成するためのシンプルなインターフェイスを提供することで、この問題を回避するのに役立ちます。オブジェクトが変更されたり、他のオブジェクトが追加されたりしても、Factory オブジェクトは同じ方法で呼び出されます。ブログエントリの表示は表示のインスタンスです。

さまざまなオブジェクトを作成することだけが、ファクトリ デザイン パターンを使用する目的ではありません。 Factory デザイン パターンに基づくクラスのもう 1 つの使用例は、項目のコレクションを操作する場合です。この場合、オブジェクト コレクションには同じ基本オブジェクトが含まれていますが、各オブジェクトは異なる特性を持っています。

作成するオブジェクトのタイプを決定するために複数の手順が必要な場合は、ファクトリ設計パターンに基づいたクラスを使用して新しいインスタンスを取得することをお勧めします。

UML

この UML 図は、ファクトリ デザイン パターンを使用したクラス デザインを詳しく説明します。

PHP オブジェクト指向の高度なデザイン パターン: ファクトリ パターンの使用例

以下は上の図の説明です:

1. 2 つの既存の基本クラスは MyObjectTyepA と MyObjectTyepB です。どちらの鉱山にも doSomething() というパブリック メソッドがあり、独自の方法でオブジェクト固有のロジックを実行します。 2 つの基本クラスのパブリック インターフェイスと戻り値の型はまったく同じです。

2. MyObjectFactory クラスは、上記の基本クラスのインスタンスを作成し、それをコード フローに返すために使用されます。これには、パラメータ型を受け入れる createObject() というパブリック メソッドがあり、基本クラスのどのインスタンスを作成するかを決定するのに役立ちます。その後、createObject() メソッドは、要求された型クラスのインスタンスを返します。

PHPデザインパターン ファクトリパターンの使用例

<?php
/*
* 每日练习 PHP设计模式工厂模式的使用方法
* PHP工厂模式不难理解,顾名思义,就是一个加工厂,然后工厂是制造产品的,只要制造产品
* 就必须有几个要素:"方法","模型","工厂车间"。
*/
/*第一种示例 普通工厂模式
* */
abstract class model {//产品模型
abstract function getNames();
}
class zhangsan extends model {//产品实例
function getNames(){
return "my name is zhengsan";
}
}
class lisi extends model{//产品实例
function getNames(){
return "my name is lisi";
}
}
abstract class gongchangModel {//工厂模型
abstract function getZhangsan();
abstract function getLisi();
}
class gongchang extends gongchangModel{//工厂实例
function getZhangsan(){
return new zhangsan();
}
function getLisi(){
return new lisi();
}
}
$gongchang=new gongchang();//实例化工厂
$zhangsan=$gongchang->getZhangsan();//制造产品
echo $zhangsan->getNames();//产品输出功能
?>

ファクトリデザインパターンについては以前記事を書きましたが、実はファクトリパターンには通常のファクトリパターンと抽象ファクトリパターンがありますが、それらはすべて、オブジェクトを生成するという 1 つの機能を持っています。

それでは、以下の最も単純な例を使用して、PHP デザイン パターンのファクトリ パターンを示してみましょう。

工場モデルの 3 つの要素をまとめました。

1. 製品モデル

2. 工場ワークショップ

<?php
abstract class prModel {//产品模型
abstract function link();
}
class webLink extends prModel{//实例一个产品
public function link(){
echo "www.jb51.net";
}
}
class gongchang {//工厂
static public function createLink (){
return new webLink();
}
}
$weblink=gongchang::createLink();//通过工厂制造一个对象
$weblink->link();//输出 www.jb51.net
?>

以上がPHP オブジェクト指向の高度なデザイン パターン: ファクトリ パターンの使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。