Maison >développement back-end >tutoriel php >Résumé des exemples d'utilisation du modèle de fabrique php

Résumé des exemples d'utilisation du modèle de fabrique php

黄舟
黄舟original
2017-09-02 09:12:382071parcourir

Cet article présente principalement le modèle d'usine des modèles de conception PHP. Il présente brièvement le concept et les principes du modèle d'usine et résume et analyse la définition et l'utilisation spécifiques du modèle d'usine sous forme d'exemples. à cela

L'exemple de cet article décrit le modèle d'usine du modèle de conception PHP. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Quel est le but ou l'objectif de l'utilisation du mode usine ?

Le plus grand avantage du modèle d'usine réside dans la création d'objets, qui consiste à encapsuler le processus de création d'objets, afin qu'un nouvel objet puisse être généré à tout moment.

Réduisez le code et copiez-collez, la relation de couplage est importante et elle affecte d'autres parties du code.

En termes simples, vous utilisiez new pour créer un objet, mais maintenant ce processus est encapsulé.

En supposant que le mode usine n'est pas utilisé : alors la classe a est appelée à de nombreux endroits, et le code créera une instance comme celle-ci : new a() Supposons qu'un jour le nom de la classe a doive le faire. être modifié, ce qui signifie beaucoup de code d'appel. Tous doivent être modifiés.

L'avantage du patron usine réside dans la création d'objets.

L'avantage du patron usine réside dans la création d'objets. Établissez une usine (une fonction ou une méthode de classe) pour créer de nouveaux objets. Sa tâche est d'encapsuler le processus de création d'objets

La création d'objets n'utilise pas de new. Définissez plutôt une méthode de création d’instances d’objet.

Chaque classe devra peut-être se connecter à la base de données. Encapsulez ensuite la connexion à la base de données dans une classe. À l'avenir, utilisez des noms de classes dans d'autres classes :

Pourquoi introduire des concepts abstraits ?

Pensez-y, dans la vraie vie, lorsque nous sommes incapables de déterminer une chose précise, nous classons souvent une catégorie de choses dans une catégorie abstraite.

Méthode d'usine :

Par exemple, si votre usine s'appelle "Cigarette Factory", alors il peut y avoir "Septwolves Factory", "China Factory", etc. Cependant, cette usine ne produit que un produit : les cigarettes ;

Usine abstraite : Il est impossible de décrire quels produits elle produit. Elle fabrique de nombreux types de produits (l'usine abstraite générera donc des sous-usines).

Votre usine est complète et produit une « série » de produits plutôt qu'un « un », comme les « cigarettes » et la « bière ». Ensuite, il peut aussi y avoir des usines spécifiques qui en dérivent, mais ces usines fabriquent toutes cette série de produits, mais le goût peut être différent en raison des différentes régions et pour s'adapter aux goûts locaux.

Modèle d'usine : compris comme une usine qui ne génère qu'un seul produit. Par exemple, ceux qui produisent des cigarettes.

Méthode usine : une ligne de production de produits en usine. Par exemple, le processus de génération de clavier.

D'autres réfuteront : je n'ai rien à faire quand je suis rassasié, donc je dois changer le nom de la classe ? Peut être. Généralement, les noms de classes ne sont pas modifiés.

En fait, il existe de nombreuses variantes du modèle d'usine. La clé est d'en saisir l'essence : tant que différentes instances de classe peuvent être générées en fonction de différents paramètres, cela est conforme à l'idée de conception de ​​. le modèle d'usine.

Cela me rappelle qu'il existe souvent des méthodes dans le framework qui sont chargées de générer des instances de classe spécifiques pour l'appel.

Comme j'ai déjà utilisé phpcms, il est préférable d'utiliser phpcms pour aider à comprendre, comme suit :


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

générera une instance de commande . La transmission de différents paramètres pour obtenir différentes instances de classe est cohérente avec le modèle d'usine.


pc_base:load_app_class("comment"');//生成一个comment类实例

Bien entendu, la méthode load_app_class intègre également l'idée du​​mode singleton. Évitez d'appeler n fois et de créer à plusieurs reprises n instances identiques

Une application typique à laquelle je pense en mode usine est la suivante : PHP peut avoir besoin de se lier à MySQL, ou il peut avoir besoin de se lier à sqlserver ou à d'autres bases de données. Créez ensuite une classe de base de données abstraite

Cette classe est une classe d'usine, chargée de générer différents objets.

C'est très pratique pour l'expansion. Lorsqu'on se connecte directement à la base de données, au lieu d'utiliser le code


new Mysql($host,$username,$password,$dbname)

sous la forme

, on peut générer dynamiquement une instance à laquelle se connecter la base de données. Il peut s'agir de MySQL ou connecté à 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");

Il existe également une implémentation correspondante dans le framework thinkphp :

Db.class.php est une classe d'usine (peut également être appelée la couche intermédiaire de la base de données, elle est appelée couche intermédiaire car elle peut faire fonctionner MySQL, Oracle et d'autres bases de données. Cette classe est la couche intermédiaire, protégeant l'implémentation spécifique, permettant aux programmeurs de se connecter à MySQL, Oracle, etc. sans modifier le code de requête d'origine. . Base de données

Il existe une factory() méthode dans Db.class.php pour créer différentes instances de base de données


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

ainsi qu'un paiement. interface À l'avenir, cela pourrait correspondre à différentes passerelles de paiement : Alipay, Tenpay, banque en ligne, etc. Pour faciliter l'expansion future, concevoir une usine spécifiquement pour la production d'interfaces de passerelle, les résumer et en faire des interfaces La classe doit. implémenter son interface. À l'avenir, vous pourrez ajouter un mode de paiement et modifier les paramètres

.

Le livre 4108b714f7c3d0f728383a09d933f293 (le nom anglais est PHP 5 Power Programming) mentionne également un exemple de mode usine. J'ai appris une astuce : lors de l'enregistrement des utilisateurs, divisez-les en utilisateurs avec de nombreux rôles. Tels que les utilisateurs enregistrés, les utilisateurs anonymes, les utilisateurs administrateurs, etc. Une utilisation complète peut être obtenue en utilisant l'idée d'usines, le code est également facile à maintenir et des classes d'opération peuvent être générées pour chaque rôle.

Définissez les classes suivantes :

UserFactory Classe d'usine d'utilisateurs, chargée de générer différentes classes d'utilisateurs
Utilisateur : la classe de base des classes d'utilisateurs, toutes les classes d'utilisateurs héritent de cette classe
Classes avec différents rôles : classe d'utilisateurs enregistrés, classe d'utilisateurs anonymes, classe d'utilisateurs administrateur

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn