Concept : Définition du modèle d'usine : Fournit une interface pour créer des objets, ce qui signifie produire des produits (objets) correspondants selon les instructions (paramètres) du leader (appelant).
Créer un objet nécessite souvent un processus complexe, il ne convient donc pas à un objet complexe.
La création d'objets peut entraîner de nombreuses duplications de code et peut ne pas fournir un niveau d'abstraction suffisant.
Une usine transfère la création d'objets membres vers un objet externe. L'avantage est d'éliminer le couplage (c'est-à-dire l'influence mutuelle) entre les objets
Catégorie :
Modèle d'usine simple : utilisez une classe, généralement un singleton, pour générer des instances.
Modèle d'usine complexe La définition est la suivante : poussez l'instanciation de ses objets membres vers la sous-classe, et la sous-classe peut remplacer la méthode d'interface de la classe parent pour créer lors de la spécification votre propre type d'objet.
La classe parent ne gère que les problèmes généraux lors du processus de création seront hérités par les sous-classes, et les sous-classes sont indépendantes les unes des autres , spécifiquement Business. la logique sera écrite dans des sous-classes.
Implémentation du code :
Modèle d'usine simple :
var XMLHttpFactory =function(){}; //这是一个简单工厂模式 XMLHttpFactory.createXMLHttp =function(){ var XMLHttp = null; if (window.XMLHttpRequest){ XMLHttp = new XMLHttpRequest() }else if (window.ActiveXObject){ XMLHttp = new ActiveXObject("Microsoft.XMLHTTP") } return XMLHttp; } //XMLHttpFactory.createXMLHttp()这个方法根据当前环境的具体情况返回一个XHR对象。 var AjaxHander =function(){ var XMLHttp = XMLHttpFactory.createXMLHttp(); ... }
Modèle d'usine complexe : Processus ==》 Concevez d'abord une classe abstraite. Cette classe ne peut pas être instanciée et ne peut être utilisée que pour dériver des enfants. ., et enfin implémenter la méthode factory en étendant la sous-classe
var XMLHttpFactory =function(){}; //这是一个抽象工厂模式 XMLHttpFactory.prototype = { //如果真的要调用这个方法会抛出一个错误,它不能被实例化,只能用来派生子类 createFactory:function(){ throw new Error('This is an abstract class'); } } var XHRHandler =function(){}; //定义一个子类 // 子类继承父类原型方法 extend( XHRHandler , XMLHttpFactory ); XHRHandler.prototype =new XMLHttpFactory(); //把超类原型引用传递给子类,实现继承 XHRHandler.prototype.constructor = XHRHandler; //重置子类原型的构造器为子类自身 //重新定义createFactory 方法 XHRHandler.prototype.createFactory =function(){ var XMLHttp =null; if (window.XMLHttpRequest){ XMLHttp =new XMLHttpRequest(); }else if (window.ActiveXObject){ XMLHttp =new ActiveXObject("Microsoft.XMLHTTP") } return XMLHttp; }
Scénarios d'application :
Le modèle d'usine est particulièrement utile dans les scénarios suivants :
(1) La construction d'objets est très complexe
(2) Différentes instances doivent être créées en fonction de l'environnement spécifique
(3) Traitement d'un grand nombre de petits objets avec les mêmes propriétés
Avantages :
peut mettre en œuvre certains des mêmes méthodes, et ces mêmes méthodes que nous pouvons mettre dans le parent. Si vous écrivez du code dans une classe et devez implémenter une logique métier spécifique, vous pouvez remplacer les méthodes de la classe parent dans une sous-classe pour implémenter votre propre logique métier
En d'autres termes, il y a deux points : 1. Affaiblir le couplage entre les objets pour éviter la duplication de code. L'instanciation d'une classe dans une méthode élimine le code répétitif. 2. Du code répétitif peut être écrit dans la classe parent. La sous-classe hérite de toutes les propriétés et méthodes membres de la classe parent, et la sous-classe se concentre uniquement sur la mise en œuvre de sa propre logique métier.Inconvénients :
Lorsque l'usine atteint un certain niveau, la complexité du code augmente et la lisibilité diminue. Et cela ne résout pas le problème de la reconnaissance des objets, c’est-à-dire comment connaître le type d’un objet.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!