Maison  >  Article  >  développement back-end  >  Explication détaillée du modèle d'usine de modèles de conception PHP

Explication détaillée du modèle d'usine de modèles de conception PHP

墨辰丷
墨辰丷original
2018-05-18 10:54:481401parcourir

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. à lui

Les détails sont les suivants :

Quel est le but ou l'objectif de l'utilisation du modèle d'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 au lieu d'un "un", comme des "cigarettes" et de 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, et en saisir l'essence est la clé : tant que différentes instances de classe peuvent être générées en fonction de différents paramètres, alors 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 le commandez cette instance. 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 sûr, 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 pour vous 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é une base de données La couche intermédiaire 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, qui permet aux programmeurs de se connecter à MySQL sans modifier le code de requête d'origine, Oracle et d'autres bases de données. Il existe une méthode

dans

factory()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;
}

Lors de la création d'interfaces de paiement, elles pourraient correspondre à différentes passerelles de paiement à l'avenir : Alipay, Tenpay, banque en ligne, etc. Pour faciliter l'expansion future, concevez un modèle d'usine spécialisé dans la production d'interfaces de passerelle et résumez-les sous forme d'interfaces, afin que toutes les sous-classes doivent l'implémenter. À l'avenir, vous pourrez ajouter un mode de paiement et modifier les paramètres pour décider quel mode de paiement utiliser. Nommé PHP 5 Power Programming) j'ai également mentionné un exemple de mode usine. J'ai appris une astuce : lors de l'enregistrement des utilisateurs, les utilisateurs peuvent être. divisé en de nombreux rôles, tels que les utilisateurs enregistrés, les utilisateurs anonymes, les utilisateurs administrateurs, etc. Il peut être implémenté en utilisant l'idée d'une usine et le code est facile à maintenir. Les classes suivantes peuvent être générées pour chaque rôle :

.

Classe d'usine d'utilisateurs UserFactory, 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, personnel de direction Classe d'utilisateurs


Recommandations associées :

Cas d'utilisation et analyse des modèles PHP Factory

PHP singleton et mode usine

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