PHP设计模式漫谈之工厂模式
在《你是否了解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>
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>
测试代码会向工厂请求 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>
这段代码要简单得多。它仅有一个接口 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>
如上所述,有时此类模式在规模较小的环境中似乎有些大材小用。不过,最好还是学习这种扎实的编码形式,以便应用于任意规模的项目中。
- PHP设计模式漫谈之代理模式
- PHP设计模式漫谈之责任链模式
- PHP设计模式漫谈之结构模式
- PHP设计模式漫谈之命令模式

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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.

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.

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

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.

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

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

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

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