Maison php教程 php手册 PHP设计模式漫谈之工厂模式

PHP设计模式漫谈之工厂模式

Jun 13, 2016 am 10:19 AM
php un 介绍 exister 工厂 nous 模式 简单 设计模式

在《你是否了解PHP设计模式》一文中,我们曾简单介绍过工厂模式,今天我们再来详细看看PHP开发中工厂模式的应用场景。

欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

最初在设计模式一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。

该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。

在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。

工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

示例1:显示工厂类的一个示列。等式的服务器端包括两个部分:数据库和一组 PHP 页面,这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章。

<ol class="dp-c"><li class="alt"><span><span><?php  </span></span><li>
<span class="keyword">interface</span><span> IUser  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>  </span><span class="keyword">function</span><span> getName();  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">class</span><span> User </span><span class="keyword">implements</span><span> IUser  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> __construct( </span><span class="vars">$id</span><span> ) { }  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> getName()  </span>
</li>
<li><span>  {  </span></li>
<li class="alt">
<span>    </span><span class="keyword">return</span><span> </span><span class="string">"Jack"</span><span>;  </span>
</li>
<li><span>  }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">class</span><span> UserFactory  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> Create( </span><span class="vars">$id</span><span> )  </span>
</li>
<li><span>  {  </span></li>
<li class="alt">
<span>    </span><span class="keyword">return</span><span> </span><span class="keyword">new</span><span> User( </span><span class="vars">$id</span><span> );  </span>
</li>
<li><span>  }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="vars">$uo</span><span> = UserFactory::Create( 1 );  </span>
</li>
<li>
<span class="func">echo</span><span>( </span><span class="vars">$uo</span><span>->getName().</span><span class="string">"\n"</span><span> );  </span>
</li>
<li class="alt"><span>?> </span></li></span></li></ol>
Copier après la connexion

IUser接口定义用户对象应执行什么操作。IUser 的实现称为 User,UserFactory 工厂类则创建 IUser 对象。此关系可以用图1中的UML 表示。


图 1. 工厂类及其相关 IUser 接口和用户类

如果您使用 php 解释器在命令行上运行此代码,将得到如下结果:

<ol class="dp-c">
<li class="alt"><span><span>% php factory1.php   </span></span></li>
<li><span>Jack  </span></li>
<li class="alt"><span>%  </span></li>
</ol>
Copier après la connexion

测试代码会向工厂请求 User 对象,并输出 getName 方法的结果。

有一种工厂模式的变体使用工厂方法。类中的这些公共静态方法构造该类型的对象。如果创建此类型的对象非常重要,此方法非常有用。例如,假设您需要先创建对象,然后设置许多属性。此版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也不必将复制好的代码在在代码库中到处粘贴。

示例2 显示使用工厂方法的一个示例。

<ol class="dp-c"><li class="alt"><span><span><?php  </span></span><li>
<span class="keyword">interface</span><span> IUser  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>  </span><span class="keyword">function</span><span> getName();  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">class</span><span> User </span><span class="keyword">implements</span><span> IUser  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> Load( </span><span class="vars">$id</span><span> )   </span>
</li>
<li><span>  {  </span></li>
<li class="alt">
<span>        </span><span class="keyword">return</span><span> </span><span class="keyword">new</span><span> User( </span><span class="vars">$id</span><span> );  </span>
</li>
<li><span>  }  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> Create( )   </span>
</li>
<li class="alt"><span>  {  </span></li>
<li>
<span>        </span><span class="keyword">return</span><span> </span><span class="keyword">new</span><span> User( null );  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> __construct( </span><span class="vars">$id</span><span> ) { }  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> getName()  </span>
</li>
<li><span>  {  </span></li>
<li class="alt">
<span>    </span><span class="keyword">return</span><span> </span><span class="string">"Jack"</span><span>;  </span>
</li>
<li><span>  }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="vars">$uo</span><span> = User::Load( 1 );  </span>
</li>
<li>
<span class="func">echo</span><span>( </span><span class="vars">$uo</span><span>->getName().</span><span class="string">"\n"</span><span> );  </span>
</li>
<li class="alt"><span>?> </span></li></span></li></ol>
Copier après la connexion

这段代码要简单得多。它仅有一个接口 IUser 和一个实现此接口的 User 类。User 类有两个创建对象的静态方法。此关系可用图 2 中的 UML 表示。


图 2. IUser 接口和带有工厂方法的 user 类

在命令行中运行脚本产生的结果与清单 1 的结果相同,如下所示:

<ol class="dp-c">
<li class="alt"><span><span>% php factory2.php   </span></span></li>
<li><span>Jack  </span></li>
<li class="alt"><span>% </span></li>
</ol>
Copier après la connexion

如上所述,有时此类模式在规模较小的环境中似乎有些大材小用。不过,最好还是学习这种扎实的编码形式,以便应用于任意规模的项目中。

  1. PHP设计模式漫谈之代理模式
  2. PHP设计模式漫谈之责任链模式
  3. PHP设计模式漫谈之结构模式
  4. PHP设计模式漫谈之命令模式

Déclaration de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Configuration du projet CakePHP Configuration du projet CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Routage CakePHP Routage CakePHP Sep 10, 2024 pm 05:25 PM

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

See all articles