PHP设计模式--工厂方法
声明:本系列博客参考资料《大话设计模式》,作者程杰。
前面我们介绍了简单工厂,今天我们继续学习另外一个工厂??工厂方法。
具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:
工厂方式模式主要由以下几种角色组成:
抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
根据以上UML类图和角色编写以下PHP代码:
<?php /** * Created by PhpStorm. * User: Jiang * Date: 2015/4/16 * Time: 22:12 *//**抽象产品角色 汉堡 * Interface IHanbao */interface IHanbao{ function Allay();}/**具体产品角色 肉松汉堡 * Class RouSongBao */class RouSongBao implements IHanbao{ function Allay() { echo "I am 肉松汉堡,小的给主人解饿了!<br/>"; }}/**鸡肉汉堡 * Class ChickenBao */class ChickenBao implements IHanbao{ function Allay() { echo "I am 鸡肉汉堡,小的给主人解饿了!<br>"; }}/**抽象工厂角色 * Interface IServerFactory */interface IServerFactory{ function MakeHanbao();}/**具体工厂角色 肉松汉堡工厂 * Class RouSongFactory */class RouSongFactory implements IServerFactory{ function MakeHanbao() { return new RouSongBao(); }}class ChickenFactory implements IServerFactory{ function MakeHanbao() { return new ChickenBao(); }}
测试代码:
header("Content-Type:text/html;charset=utf-8");//------------------------工厂方式测试代码------------------require_once "./FactoryMethod/FactoryMethod.php";//-----------------餐厅厨师-----------$chickenFactory=new ChickenFactory();$rouSongFactory=new RouSongFactory();//-----------点餐------------$chicken1=$chickenFactory->MakeHanbao();$chicken2=$chickenFactory->MakeHanbao();$rouSong1=$rouSongFactory->MakeHanbao();$rouSong2=$rouSongFactory->MakeHanbao();//------------------顾客吃饭---------$chicken1->Allay();$chicken2->Allay();$rouSong1->Allay();$rouSong2->Allay();
用浏览器运行测试代码我们可以发现,顾客都享用了自己的食物。
工厂方法模式优缺点:
优势:克服了简单工厂模式违背开放-封闭的原则,保持了封装对象创建过程的优点。
缺陷:当增加产品时,就得增加一个产品工厂的类,增加额外的开发量。避免不了分支判断的问题。
简单工厂模式与工厂方法模式的比较:
1. 结构复杂度
简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,从而增加了结构的复杂程度。
2.代码复杂度
代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
3.管理上的难度
假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。
PHP面向对象设计模式

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。
