検索
ホームページバックエンド開発PHPチュートリアルPHPの簡易ファクトリパターンとファクトリパターンのまとめ

まずは簡単なファクトリパターンを見てみましょう。 コードは次のとおりです。

<?php
/**
 * 一个事例
 *
 * 一个农场,要向市场销售水果
 * 农场里有三种水果 苹果、葡萄
 * 我们设想:1、水果有多种属性,每个属性都有不同,但是,他们有共同的地方 | 生长、种植、收货、吃
 *       2、将来有可能会增加新的水果、我们需要定义一个接口来规范他们必须实现的方法
 *       3、我们需要获取某个水果的类,要从农场主那里去获取某个水果的实例,来知道如何生长、种植、收货、吃
 */
  
  
/**
 * 虚拟产品接口类
 * 定义好需要实现的方法
 */
  
interface fruit{
  
  /**
   * 生长
   */
  public function grow();
  
  /**
   * 种植
   */
  public function plant();
  
  /**
   * 收获
   */
  public function harvest();
  
  /**
   * 吃
   */
  public function eat();
    
}
  
/**
 * 定义具体产品类 苹果
 * 首先,我们要实现所继承的接口所定义的方法
 * 然后定义苹果所特有的属性,以及方法
 */
class apple implements fruit{
  
  //苹果树有年龄
  private $treeAge;
  
  //苹果有颜色
  private $color;
  
  public function grow(){
    echo "grape grow";
  }
  
  public function plant(){
    echo "grape plant";
  }
  
  public function harvest(){
    echo "grape harvest";
  }
  
  public function eat(){
    echo "grape eat";
  }
  
  //取苹果树的年龄
  public function getTreeAge(){
    return $this->treeAge;
  }
  
  //设置苹果树的年龄
  public function setTreeAge($age){
    $this->treeAge = $age;
    return trie;
  }
  
}
  
/**
 * 定义具体产品类 葡萄
 * 首先,我们要实现所继承的接口所定义的方法
 * 然后定义葡萄所特有的属性,以及方法
 */
class grape implements fruit{
  
  //葡萄是否有籽
  private $seedLess;
  
  public function grow(){
    echo "apple grow";
  }
  
  public function plant(){
    echo "apple plant";
  }
  
  public function harvest(){
    echo "apple harvest";
  }
  
  public function eat(){
    echo "apple eat";
  }
  
  //有无籽取值
  public function getSeedLess(){
    return $this->seedLess;
  }
  
  //设置有籽无籽
  public function setSeedLess($seed){
    $this->seedLess = $seed;
    return true;
  }
}
  
/**
 *农场主类 用来获取实例化的水果
 *
 */
class farmer{
  
  //定义个静态工厂方法
  public static function factory($fruitName){
    switch ($fruitName) {
      case &#39;apple&#39;:
        return new apple();
        break;
      case &#39;grape&#39;:
        return new grape();
        break;
      default:
        throw new badFruitException("Error no the fruit", 1);
        break;
    }
  }
}
  
class badFruitException extends Exception{
  public $msg;
  public $errType;
  public function __construct($msg = &#39;&#39; , $errType = 1){
    $this->msg = $msg;
    $this->errType = $errType;
  }  
}
  
/**
 * 获取水果实例化的方法
 */
try{
  $appleInstance = farmer::factory(&#39;apple&#39;);
  var_dump($appleInstance);
}catch(badFruitException $err){
  echo $err->msg . "_______" . $err->errType;
}

以下では、主に PHP デザインパターンのファクトリパターンを紹介し、ファクトリパターンの概念と原理を簡単に紹介します。ファクトリ パターンの具体的な定義と使用法を例の形で分析します。必要な友人がそれを参照できるように、すべての人に役立つことを願っています。

この記事の例では、PHP デザインパターンのファクトリーパターンについて説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

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

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

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

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

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

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

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

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

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

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

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

工場メソッド:

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

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

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

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

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

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

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

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

pc_base:load_app_class("order"&#39;);//参数名称就是类名称。

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

pc_base:load_app_class("comment"&#39;);//生成一个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 &#39;Drivers/&#39; . $db_class_name . &#39;.php&#39;) {
      $classname = &#39;Driver_&#39; . $db_class_name;
      return new $db_class_name;
    } else {
      throw new Exception (&#39;对应的数据库类没找到&#39;);
    } 
  }
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");

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


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

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

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

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

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

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

関連する推奨事項:

JS抽象ファクトリパターンの簡単な分析_基礎知識

phpデザインパターンファクトリパターンの役割は何ですか?

3つのPHPファクトリーモードの簡単な紹介

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

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

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPおよびPython:類似点と相違点を調査しますPHPおよびPython:類似点と相違点を調査しますApr 19, 2025 am 12:21 AM

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境