PHPデザインパターン ファクトリパターンの詳細解説

墨辰丷
リリース: 2023-03-26 13:50:01
オリジナル
1402 人が閲覧しました

この記事では、主に PHP デザインパターンのファクトリパターンを紹介し、ファクトリパターンの概念と原則を簡単に紹介し、ファクトリパターンの具体的な定義と使用法をサンプルの形式で要約および分析します。

詳細は次のとおりです:

ファクトリーパターンを使用する目的または目標は何ですか?

ファクトリ パターンの最大の利点はオブジェクトの作成にあり、オブジェクトの作成プロセスをカプセル化して、いつでも新しいオブジェクトを生成できるようにします。

コードを減らしてコピーアンドペーストすると、結合関係が重くなり、コードの他の部分に影響を与えます。

平たく言えば、以前は new を使用してオブジェクトを作成していましたが、今ではこのプロセスがカプセル化されています。

ファクトリ モードが使用されていないと仮定します。その場合、クラス a がさまざまな場所で呼び出され、コードは次のようなインスタンスを作成します: new a() ある日、クラス a の名前を変更する必要があるとします。これは、多くの呼び出しコードを変更する必要があることを意味します。

ファクトリー パターンの利点は、オブジェクトの作成にあります。

ファクトリー パターンの利点は、オブジェクトの作成にあります。新しいオブジェクトを作成するためのファクトリ (関数またはクラス メソッド) を確立します。そのタスクは、オブジェクトの作成プロセスをカプセル化することです。

オブジェクトの作成には new の形式は使用されません。代わりに、オブジェクト インスタンスを作成するメソッドを定義します。

各クラスはデータベースに接続する必要がある場合があります。次に、データベースへの接続をクラスにカプセル化します。将来的には、他のクラスでもそのクラス名を使用してください:

なぜ抽象概念を導入するのでしょうか?

考えてみてください。実生活では、何かを具体的に決定できないとき、私たちは物事のカテゴリーを抽象的なカテゴリーに分類することがよくあります。

工場メソッド:

たとえば、工場が「タバコ工場」と呼ばれる場合、「セプトウルブズ工場」、「中国工場」などが考えられます。ただし、この工場はタバコ 1 つの製品のみを生産します。工場: 説明できません どのような製品を生産しますか? 多くの種類の製品を生産します (したがって、抽象工場はサブ工場を生成します)。

あなたの工場は総合的で、「タバコ」や「ビール」などの製品を「1 つ」ではなく「一連」に生産しています。また、それに由来する特定の工場を持つこともできますが、これらの工場はすべてこのシリーズの製品を生産していますが、地域が異なるため、また地元の好みに合わせて味が異なる場合があります。

工場パターン: 1 つの製品のみを生成する工場として理解されます。たとえば、タバコを生産する人たち。

工場方式:工場内の製品生産ライン。たとえば、キーボードの生成プロセスです。

他の人は「お腹がいっぱいになっても何もすることがないので、クラス名を変更しなければならないのですか?」と反論します。多分。通常、クラス名は変更されません。

実際、ファクトリ パターンには多くのバリエーションがあり、本質を把握することが重要です。異なるパラメータに基づいて異なるクラス インスタンスを生成できる限り、ファクトリ パターンの設計思想と一致しています。 。

これで、フレームワークには、呼び出し用の特定のクラス インスタンスの生成を担当するメソッドが存在することがよくあることを思い出しました。

私は以前に phpcms を使用したことがあるので、次のように phpcms を使用すると理解が容易になります:

pc_base:load_app_class("order"');//参数名称就是类名称。
ログイン後にコピー

は order のインスタンスを生成します。異なるパラメータを渡して異なるクラス インスタンスを取得することは、ファクトリ パターンと一致しています。

pc_base:load_app_class("comment"');//生成一个comment类实例
ログイン後にコピー

もちろん、load_app_class メソッドにもシングルトン モードの考え方が組み込まれています。 n 回呼び出して n 個の同一のインスタンスを繰り返し作成することは避けてください

ファクトリ モードで私が考える典型的なアプリケーションは次のとおりです: PHP は mysql にリンクする必要がある場合や、sqlserver または他のデータベースにリンクする必要がある場合があります。次に、抽象データベース クラスを作成します。

このクラスは、さまざまなオブジェクトの生成を担当するファクトリ クラスです。

このように拡張するととても便利です。データベースに直接接続する場合、コード

new Mysql($host,$username,$password,$dbname)
ログイン後にコピー

を使用する代わりに、データベースに接続するためのインスタンスを動的に生成できます。 mysql または oracle に接続することができます。

class DbFactory
{
  function static factory($db_class_name)
  {
    $db_class_name = strtolower($db_class_name);
    if (include_once 'Drivers/' . $db_class_name . '.php') {
      $classname = 'Driver_' . $db_class_name;
      return new $db_class_name;
    } else {
      throw new Exception ('对应的数据库类没找到');
    } 
  }
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");
ログイン後にコピー

thinkphp フレームワークにも対応する実装があります:

Db.class.php はファクトリ クラスです (データベース中間層とも呼ばれます。操作できるため、中間層と呼ばれます) mysql、oracle などのデータベース。このクラスは特定の実装を保護する中間層であり、元のクエリ コードを変更せずに mysql、oracle、およびその他のデータベースに接続できます。Db.class.php には

メソッドがあります。さまざまなデータベース インスタンス

public function factory($db_config='') {
    // 读取数据库配置
    $db_config = $this->parseConfig($db_config);
    if(empty($db_config['dbms']))
      throw_exception(L('_NO_DB_CONFIG_'));
    // 数据库类型
    $this->dbType = ucwords(strtolower($db_config['dbms']));
    $class = 'Db'. $this->dbType;
    if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
      // 内置驱动
      $path = CORE_PATH;
    }else{ // 扩展驱动
      $path = EXTEND_PATH;
    }
    // 检查驱动类
    if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
      $db = new $class($db_config);
      // 获取当前的数据库类型
      if( 'pdo' != strtolower($db_config['dbms']) )
        $db->dbType = strtoupper($this->dbType);
      else
        $db->dbType = $this->_getDsnType($db_config['dsn']);
      if(APP_DEBUG) $db->debug  = true;
    }else {
      // 类没有定义
      throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);
    }
    return $db;
}
ログイン後にコピー

factory()を作成するとき、および支払いインターフェイスを作成するとき、将来的にはさまざまな支払いゲートウェイ (Alipay、Tenpay、オンライン バンキングなど) に対応する可能性があります。将来の拡張を容易にするために、専用のファクトリー モードを設計します。ゲートウェイ インターフェイスを生成するファクトリは抽象化され、インターフェイス フォームに作成されるため、将来的にはすべてのサブクラスでそのインターフェイスを実装する必要があり、使用する支払い方法のパラメーターを変更できます。 Books (英語名は PHP 5 Power Programming) にもファクトリー モードの例が記載されており、ユーザーを登録する際に、登録済みユーザー、匿名ユーザー、管理者ユーザーなど、多くの役割にユーザーが分割されるというコツが学べました。ファクトリーの考え方を使用して完全に実装でき、コードのメンテナンスが簡単です。ロールごとに次のクラスを生成できます。

UserFactory ユーザー ファクトリ クラス、さまざまなユーザー クラスの生成を担当します
User: ユーザー クラスの基本クラス、すべてのユーザー クラスはこのクラスを継承します
異なる役割を持つクラス: 登録済みユーザー クラス、匿名ユーザー クラス、管理者ユーザー クラス


関連する推奨事項:

PHP ファクトリ パターンの使用例と分析

PHP シングルトンとファクトリ パターン

以上がPHPデザインパターン ファクトリパターンの詳細解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート