プロトタイプパターンの主な役割
抽象プロトタイプ (プロトタイプ) の役割: 自身をクローンするインターフェイスを宣言します
具体的なプロトタイプの役割: 自分自身のクローン作成操作を実装します
クラスがほぼ同じで一部が異なる場合、このクラスのオブジェクトが多数必要な場合、毎回同じ部分を繰り返しインスタンス化するのは非常にコストがかかり、クローン作成前に作成されたオブジェクトが同じ部分なので経費も節約できます。
PHPの実装方法は、このクラスの初期化を__construct()関数とinitialize関数で別々に処理し、プロトタイプをpublic部分であるconstructに配置し、各オブジェクトの特殊部分をinitializeに配置します。このようにして、まず初期化せずにクラスを作成し、その後クラスを複製するたびに初期化します。
これはzendフレームワークの公式マニュアル http://framework.zend.com/manual/2.0/en/user-guide/database-and-models.html に記載されていますが、詳しく説明されていませんので分析してみましょう。以下にあります
1. はじめに
zf2モデルにはデータベースアクションを操作するアシスタントクラスに相当するalbumTableクラスがあり、そこでtablegatewayが使われています。
アルバムテーブルを毎回同じクラスで初期化するため、ルートディレクトリにある module.php ファイルの getServiceConfig() に初期化作業を配置し、ファクトリモードを使用し、コールバック関数を介して毎回 ServiceManager ( $sm) が必要です。オブジェクトをインスタンス化すると、そのオブジェクトが自動的に呼び出され、alumniTable が作成されます。以下のコードから、albumTable を作成するには、同じ方法で AlbumTableGateWay も作成する必要があることがわかります。このクラスは、これから説明するプロトタイプ パターンを使用します。
2. コードの詳細説明
リーリープロトタイプ パターンを使用するのは TableGateWay ではなく、ResultSet クラスであることに注意してください。 tablegateway が select() や insert() などのメソッドを呼び出すたびに、結果を表す ResultSet が作成され、これらの ResultSet の共通部分が複製され、データなどの固有の部分クラスが初期化されます。
3. その他のコード例
このプロトタイプをより明確に理解するために、zend の大きなフレームワークを脇に置いて、完全なコード例を見てみましょう。
の例PHP コンストラクターのベスト プラクティスとプロトタイプ パターン
プロトタイプ パターンに関するこの記事の前半は、実際にはコンストラクターで継承を使用してスケーラビリティを向上させる方法について説明しています。この 2 つのパターンを理解するのは簡単ではないかもしれません。プロトタイプ パターンに関する最後のコード部分を直接見てみましょう。
リーリーこれらのクラスは、実際には上記の zend コードのクラスに対応します
Dbadapter -- アダプター
RowGateWay -- ResultSet
ユーザーリポジトリ - TableGateWay
詳細については、コード内のコメントを参照してください。
ここの RowGateWay では、getusers で多数のインスタンス化が必要であることがはっきりとわかります。そのため、プロトタイプ モードが非常に必要です。
このクラスを使用するコードは次のとおりです
リーリー上記の内容は、編集者が紹介したPHPサンプルにおけるConstructor Prototype Patternのプロトタイプパターンについて詳しく説明したものです。