免責事項: この一連のブログの参考資料は、Cheng Jie 著の「Dahua Design Pattern」です。
两
設計モードと 6 つの原則とは ここまでの 2 つの内容を読んで、皆さんは設計モデルについて予備的に理解できたと思います。 次に、設計モデルの分類について説明します。
オブジェクト指向のデザイン パターンは、一般に、創造、構造、動作の 3 つのカテゴリに分類されます。
クリエイティブ タイプ: オブジェクトを作成するときに、オブジェクトを直接インスタンス化するのではなく、プログラムが特定のシナリオに基づいてオブジェクトの作成方法を決定するため、パフォーマンスの向上とアーキテクチャ上の利点が確保されます。作成パターンには主に、単純なファクトリ パターン (23 のデザイン パターンのいずれでもない)、ファクトリ メソッド、抽象ファクトリ パターン、シングルトン パターン、ジェネレータ パターン、およびプロトタイプ パターンが含まれます。
構造タイプ: 複数のオブジェクトをより大きな構造に整理するために使用されます。構造パターンには主に、アダプター モード、ブリッジ モード、コンビネーター モード、デコレーター モード、ファサード モード、Hengyuan モード、プロキシ モードが含まれます。
動作タイプ: システム間のオブジェクトの通信と、複雑なシステムでのプロセスの制御方法を支援するために使用されます。行動パターンには主に、コマンド モード、インタプリタ モード、イテレータ モード、メディエータ モード、メモ モード、オブザーバ モード、ステート モード、ストラテジー モード、テンプレート モード、ビジター モード、および責任連鎖モードが含まれます。 hownd今日、最初の単純な工場パターンの作成パターンを紹介します。
オブジェクト指向設計パターンを使用する オブジェクト指向設計パターンで使用するもの --
単純なファクトリ パターンでは、ファクトリ オブジェクトを使用して、どの製品クラス インスタンスを作成するかを決定します。シンプル ファクトリ パターンは、ファクトリ パターン ファミリの中で最も単純かつ最も実用的なパターンであり、さまざまなファクトリ パターンの特別な実装として理解できます。その本質は、ファクトリ クラスが、受信パラメータに基づいて製品クラス (これらの製品クラスは親クラスまたはインターフェイスから継承する) のどのインスタンスを作成する必要があるかを動的に決定することです。
内部ロジックを実装するすべてのインスタンスを作成するためのものです。ファクトリ クラスは外部から直接呼び出して、必要な製品オブジェクトを作成できます。
抽象プロダクト (IProduct) の役割: 単純なファクトリ パターンによって作成されるすべてのオブジェクトの親クラスで、すべてのインスタンスに共通のパブリック インターフェイスを記述します。
具体的なプロダクトの役割: 単純なファクトリ パターンの作成ターゲットです。作成されたすべてのオブジェクトは、この役割を果たす特定のクラスのインスタンスです。
次に、上記の UML クラス図に基づいて次の PHP コードを記述します。
<?php/** * Created by PhpStorm. * User: Jiang * Date: 2015/4/9 * Time: 21:48 *//**抽象产品角色 * Interface IProduct 产品接口 */interface IProduct{ /**X轴旋转 * @return mixed */ function XRotate(); /**Y轴旋转 * @return mixed */ function YRotate();}/**具体产品角色 * Class XProduct X轴旋转产品 */class XProduct implements IProduct{ private $xMax=1; private $yMax=1; function __construct($xMax,$yMax) { $this->xMax=$xMax; $this->yMax=1; } function XRotate() { echo "您好,我是X轴旋转产品,X轴转转转。。。。。。"; } function YRotate() { echo "抱歉,我是X轴旋转产品,我没有Y轴。。。。。。"; }}/**具体产品角色 * Class YProduct Y轴旋转产品 */class YProduct implements IProduct{ private $xMax=1; private $yMax=1; function __construct($xMax,$yMax) { $this->xMax=1; $this->yMax=$yMax; } function XRotate() { echo "抱歉,我是Y轴旋转产品,我没有X轴。。。。。。"; } function YRotate() { echo "您好,我是Y轴旋转产品,Y轴转转转。。。。。。"; }}/**具体产品角色 * Class XYProduct XY轴都可旋转产品 */class XYProduct implements IProduct{ private $xMax=1; private $yMax=1; function __construct($xMax,$yMax) { $this->xMax=$xMax; $this->yMax=$yMax; } function XRotate() { echo "您好,我是XY轴都可旋转产品,X轴转转转。。。。。。"; } function YRotate() { echo "您好,我是XY轴都可旋转产品,Y轴转转转。。。。。。"; }}/**工厂角色 * Class ProductFactory */class ProductFactory{ static function GetInstance($xMax,$yMax) { if($xMax>1 && $yMax===1) { return new XProduct($xMax,$yMax); } elseif($xMax===1 && $yMax>1) { return new YProduct($xMax,$yMax); } elseif($xMax>1 && $yMax>1) { return new XYProduct($xMax,$yMax); } else { return null; } }}
<?php/** * Created by PhpStorm. * User: Jiang * Date: 2015/4/9 * Time: 21:54 */require_once "./SimpleFactory/SimpleFactory.php";header("Content-Type:text/html;charset=utf-8");$pro=array();$pro[]=ProductFactory::GetInstance(1,12);$pro[]=ProductFactory::GetInstance(12,1);$pro[]=ProductFactory::GetInstance(12,12);$pro[]=ProductFactory::GetInstance(0,12);foreach($pro as $v){ if($v) { echo "<br/>"; $v->XRotate(); echo "<br/>"; $v->YRotate(); } else { echo "非法产品!<br/>"; } echo "<hr/>";}
ブラウザを使用してテスト コードにアクセスすると、作成されたオブジェクトが順に YProduct、XProduct、XYProduct、null であることがわかります。シンプル ファクトリのコア コードは、ファクトリ (ProductFactory) の役割にあります。ここでは、受信した xMax 値と yMax 値に基づいてさまざまなオブジェクトが作成されます。これがシンプル ファクトリの本質であり、特定の製品はわかりません。テスト中にクライアントを呼び出すとき、これはどのようになりますか? これにより、呼び出しと作成が分離されます。
単純なファクトリの利点: オブジェクトの呼び出し元がオブジェクト作成プロセスから分離され、オブジェクトの呼び出し元がオブジェクトを必要とするときに、それをファクトリに直接リクエストできます。これにより、オブジェクトの呼び出し元とオブジェクトの実装クラスのハードコード的な結合が回避され、システムの保守性と拡張性が向上します。
単純なファクトリの欠点: プロダクトを変更すると、それに応じてファクトリ クラスも変更する必要があります。たとえば、M の N 乗を求めるなどの操作クラスを追加する場合は、元のクラスを変更して、オープン/クローズの原則に違反します。