ファクトリーパターンを使用する目的または目標は何ですか?
ファクトリ パターンの最大の利点はオブジェクトの作成にあり、オブジェクトの作成プロセスをカプセル化して、いつでも新しいオブジェクトを生成できるようにします。
コードを減らしてコピー&ペーストすると、結合関係が重くなり、コードの他の部分に影響を与えます。
平たく言えば、以前は new を使用してオブジェクトを作成していましたが、今ではこのプロセスはカプセル化されています。
ファクトリ モードが使用されていないと仮定すると、クラス a がさまざまな場所で呼び出され、コードは次のようなインスタンスを作成します: new a() ある日、クラス a の名前を変更する必要があるとします。多くの呼び出しコードを変更する必要があります。
ファクトリー パターンの利点は、オブジェクトの作成にあります。
ファクトリーパターンの利点はオブジェクトの作成にあります。新しいオブジェクトを作成するためのファクトリ (関数またはクラス メソッド) を確立します。そのタスクは、オブジェクトの作成プロセスをカプセル化することです。
オブジェクトの作成には new は使用されません。代わりに、オブジェクト インスタンスを作成するメソッドを定義します。
各クラスはデータベースに接続する必要がある場合があります。次に、データベースへの接続をクラスにカプセル化します。将来的には、他のクラスでもそのクラス名を使用してください:
なぜ抽象概念を導入するのでしょうか?
考えてみてください。実生活では、何か具体的なことを決定できないとき、私たちは物事のカテゴリーを抽象的なカテゴリーに分類することがよくあります。
工場メソッド:
たとえば、工場の名前が「タバコ工場」の場合、「セプトウルブズ工場」、「中国工場」などが考えられます。ただし、この工場はタバコという 1 つの製品のみを生産します。
抽象的な工場: それ何を生産するかを説明することは不可能であり、多くの種類の製品を生産します (したがって、抽象ファクトリーはサブファクトリーを生成します)。
あなたの工場は総合的であり、「1 つの製品」ではなく「一連の」製品を生産しています。たとえば、「タバコ」や「ビール」などを生産しています。また、それに由来する特定の工場を持つこともできますが、これらの工場はすべてこのシリーズの製品を生産していますが、地域が異なるため、また地元の好みに合わせて味が異なる場合があります。
工場パターン: 1 つの製品のみを生成する工場として理解されます。たとえば、タバコを生産する人たち。
工場方式:工場内の製品生産ライン。たとえば、キーボードの生成プロセスです。
他の人は「お腹がいっぱいだと何もすることがないので、クラス名を変更しなければならないのですか?」と反論します。多分。通常、クラス名は変更されません。
実際、ファクトリ パターンには多くのバリエーションがあり、本質を把握することが重要です。異なるパラメータに従って異なるクラス インスタンスを生成できる限り、それはファクトリ パターンの設計思想と一致しています。 。
これで、フレームワークには、呼び出し用の特定のクラス インスタンスの生成を担当するメソッドが存在することがよくあることを思い出しました。
以前に phpcms を使用したことがあるので、次のように phpcms を使用すると理解が容易になります:
pc_base:load_app_class("order"');//パラメータ名はクラス名です。オーダーのインスタンスが生成されます。異なるパラメータを渡して異なるクラス インスタンスを取得することは、ファクトリ パターンと一致しています。
pc_base:load_app_class("comment"');//コメントクラスインスタンスを生成
//もちろん、load_app_classメソッドにもシングルトンモードの考え方が組み込まれています。 n 回呼び出して n 個の同一のインスタンスを繰り返し作成することは避けてください
ファクトリ モードで私が考える典型的なアプリケーションは次のとおりです: PHP は mysql にリンクする必要がある場合や、sqlserver または他のデータベースにリンクする必要がある場合があります。次に、抽象データベース クラスを作成します。
このクラスは、さまざまなオブジェクトの生成を担当するファクトリ クラスです。
このように拡張するととても便利です。データベースに直接接続する場合、コード new Mysql ($host、$username、$password、$dbname) を使用する代わりに、データベースに接続するためのインスタンスを動的に生成できます。 mysql または oracle に接続することができます。 ') {
$classname = 'Driver_' . $db_class_name;
新しい $db_class_name を返します
}
DbFactory::factory("mysql");
DbFactory::factory ("oracle");
thinkphp フレームワークにも対応する実装があります:
Db.class.php はファクトリ クラス (と呼ぶこともできます) データベースの中間層はさまざまな操作ができるため、中間層と呼ばれますこのクラスは、プログラマが元のクエリ コードを変更せずに接続できるようにする中間層です。
Db.class.php には、別のデータベースを作成するための Factory() メソッドがあります。インスタンス
パブリックファクトリー($ db_config = ''){dmaseconfig = $ this- gt; parseconfig($ db_config); driver
if (require_cache ($ Path.'driver/db/<. class. class.php> $ db = new $ class ($ db_config)
// / 現在のデータベースの種類を取得します
$db-> ;dbType = $this->_getDsnType($db_config['dsn']);
>戻る$db; オンラインバンキングなど将来の拡張を容易にするために、工場モードで設計されています。ゲートウェイ インターフェイスの生成を専門とするファクトリを定義し、それを抽象化し、インターフェイス形式にすることで、すべてのサブクラスがそのインターフェイスを実装する必要があります。将来支払い方法を追加する場合は、どの支払い方法を使用するかパラメータを変更するだけです。
書籍「php Authoritative Programming」(英語名は PHP 5 Power Programming)でも、ユーザーを登録するときに、多くの役割を持つユーザーに分割するというトリックについて説明しました。登録ユーザー、匿名ユーザー、管理者ユーザーなど。ファクトリの考え方で完全な利用が可能で、コードのメンテナンスも容易で、ロールごとに操作クラスを生成できます。
次のクラスを定義します:
UserFactory ユーザー ファクトリ クラス、さまざまなユーザー クラスの生成を担当します
User: ユーザー クラスの基本クラス、すべてのユーザー クラスはこのクラスを継承します
異なる役割を持つクラス: 登録済みユーザー クラス、匿名ユーザー クラス、管理者ユーザークラス
PHPデザインパターンまとめ - ファクトリパターン関連記事の詳細については、PHP中国語Webサイトに注目してください。