ホームページ >バックエンド開発 >PHPチュートリアル >phpファクトリーパターンの使用例まとめ

phpファクトリーパターンの使用例まとめ

黄舟
黄舟オリジナル
2017-09-02 09:12:382071ブラウズ

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

この記事では、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、およびその他のデータベースに接続できます。さまざまなデータベース インスタンス

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;
}

と、将来的には、Alipay、Tenpay、オンライン バンキングなどのさまざまな支払いゲートウェイに対応する可能性があります。将来の拡張を容易にするために、専用のプロダクション ゲートウェイが設計されています。は抽象化されてインターフェイス フォームに作成されるため、将来的にはすべてのサブクラスでそのインターフェイスを実装する必要があり、支払い方法を追加し、パラメータを変更して使用する支払い方法を決定できます。

書籍「php Authoritative Programming」(英語名は PHP 5 Power Programming) にも、ユーザーを登録するときに多くの役割を持つユーザーに分割するというコツが記載されています。登録ユーザー、匿名ユーザー、管理者ユーザーなど。ファクトリの考え方で完全な利用が可能で、コードのメンテナンスも容易で、ロールごとに操作クラスを生成できます。

次のクラスを定義します:

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

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

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