php之工厂模式和抽象工厂

php之工厂模式和抽象工厂工厂模式和抽象工厂模式

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近在看工厂模式和抽象工厂模式,把深入php那本书的这一块看了两遍,可还是迷迷糊糊的,于是去问了度娘,我觉得有篇博文里这么说的很有道理:

工厂方法
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。

抽象工厂
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

具体见博文

简而言之,工厂方法是生产同一等级的不同产品,而抽象工厂是生产不同的产品族,而往往抽象工厂中会用到工厂方法。


首先介绍一下工厂方法吧。
假设我有一个人事管理项目,它需要管理Appointment(预约)对象,被要求用BloggsCal或者MegaCal的格式来和他们交流预约,当然随着时间的发展,要求的格式肯定会变多。(在我看来这里面的格式就相当于工厂模式中的产品啦)
在接口级别上我们可以定义出两个类。其一是需要一个把Appointment对象转化成一个专有格式,把它命名为AppEncoder类(产品product),另外一个需要管理员来获得这个编码器,我们把它命名为CommsManager类(创建者creator)。
接下来我们上代码了:

abstract class ApptEncoder{ 
   
    abstract function encode();
}
class BloggsApptEncoder extends ApptEncoder{ 
   
    function encode(){ 
   
        return "Appointment data encode in BloggsCal format \n";
    }
}
abstract class CommsManager{ 
   
    abstract function getHeadText();
    abstract function getApptEncoder();
    abstract function getFooterText();
}
class BloggsCommsManager extends CommsManager{ 
   
    function getHeadText(){ 
   
        return "BloggsCal header\n";
    }
    function getApptEncoder(){ 
   
        return new BloggsApptEncoder();
    }
    function getFooterText(){ 
   
        return "BloggsCal footer \n";
    }
}

这里面我只写了一个BloggsCal格式,相当于做了一种产品,如果再添加别的如MegaCal格式时只要继承ApptEncoder类和CommsManager类就行了,这就是工厂方法。
但是有没有发现这种模式形成了一种特殊的代码重复,而且可能会导致不必要的实例化,所以使用的时候要考虑清楚再使用工厂模式

下面介绍一下抽象工厂,
上面说过工厂模式是用来生产不同产品的而抽象工厂是用来生成不同产品族。那我们接着上个例子来看。
这时候项目不再满足只有一个Appointment(预约)功能了,他需要增加Ttd(待办事宜)和Contact(联系人)的功能,这就是增加产品族了,我把类图写上来吧,省的写代码了,而且也更清楚一些。
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164363.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • spider(二) 爬虫的工作流程

    spider(二) 爬虫的工作流程

    2021年8月8日
    51
  • linux系统组成及结构[通俗易懂]

    linux系统组成及结构[通俗易懂]Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。1.linux内核内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Lin…

    2022年7月15日
    23
  • 对于梯度消失和梯度爆炸的理解

    对于梯度消失和梯度爆炸的理解

    2021年11月20日
    58
  • GetStyle,ModifyStyle,GetExStyle,ModifyStyleEx「建议收藏」

    GetStyle,ModifyStyle,GetExStyle,ModifyStyleEx「建议收藏」要添加或除去窗口的普通风格,可以使用GetStyle()和ModifyStyle()方法来实现要设置或去除窗口的扩展风格,可以使用GetExStyle()和ModifyStyleEx()方法实现1.CWnd::GetExStyle与CWnd::ModifyStyle(1)GetExStyle原型: DWORDGetStyle()const;作用: 获取

    2022年7月19日
    14
  • win10系统用激活码激活,用dos命令来激活,只能激活半年时间,暂时没找到永久的。

    win10系统用激活码激活,用dos命令来激活,只能激活半年时间,暂时没找到永久的。自己之前用激活工具激活的,激活时间好像是180天,即将到期了,于是在网上百度各种永久激活方法,参照别人的方法,发现把自己的激活状态由激活即将到期变为通知模式,瞬间一脸懵逼,于是找啊找,终于找到了这种方式,亲测可行。(1)首先查看自己系统的激活状态;快捷键win+r输入命令:slmgr.vbs-xpr; 随后弹出窗口显示2018/9/8过期。 (2)然后以管理员模式打开命令提示符窗…

    2022年5月30日
    112
  • 某次心血来潮的破解案例

    某次心血来潮的破解案例背景前面遇到一个so解密的问题,学习了一波IDA。无聊之际,买了个游戏来耍耍,突发奇想,想着尝试一些花里胡哨的东西,于是有了以下内容。逻辑分析与实现寻找对应代码实现dl

    2021年12月13日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号