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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FreeWebHostingArea_Freefilesync

    FreeWebHostingArea_Freefilesync http://bbs.et8.net/bbs/showthread.php?t=896519hostingsiteshttp://www.orbitfiles.com/http://filexoom.com/http://www.sendthisfile.com/http://www.albumtown.com/http://app02.bonpoo.com/f

    2022年10月8日
    2
  • Oracle11g_32/64软件百度云下载以及安装教程

    Oracle11g_32/64软件百度云下载以及安装教程解压后的目录点击“软件”后的目录点击32/64位系统后的目录注:文档中有安装教程百度云下载地址链接:https://pan.baidu.com/s/1PmTfXZp-bT6poghP7bNcgA提取码:dr1x复制这段内容后打开百度网盘手机App,操作更方便哦…

    2022年5月29日
    30
  • java验证电话号码的正则_html注册验证正则表达式

    java验证电话号码的正则_html注册验证正则表达式publicclassPhoneFormatCheckUtils{publicstaticbooleanisMobile(Stringmobile){Stringregex=”^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$”;Patternp=Pattern.compile(regex)…

    2025年12月14日
    3
  • virtuebox 安装VBoxGuestAdditions,ubuntu下设置文件共享

    virtuebox 安装VBoxGuestAdditions,ubuntu下设置文件共享一 安装环境 hostOS Ubuntu16 04 Virtuebox5 0 16guestOS Ubuttu16 10 二 下载安装 VBoxGuestAdd 我在网上看到的版本都是像这样的 但是我从命令行里面装的 virtuebox 不知道为什么没有上面的那一行菜单栏这里需要自己下载 VBoxGuestAdd 安装增强功能 需要注意下载的版本 如果这里的版本

    2025年11月2日
    4
  • mysql窗口函数rank_rank函数降序排名

    mysql窗口函数rank_rank函数降序排名窗口函数MySQL8.0之后支持窗口函数。窗口指的是记录集合,窗口函数是指在某种条件的记录集合上执行的特殊函数。静态窗口是指不同的记录对应的窗口大小是固定的,而滑动窗口是指随着记录的不同窗口的大小是动态变化的。窗口函数分类1)专用窗口函数,包括后面要讲到的rank,dense_rank,row_number等专用窗口函数。2)聚合函数,如sum.avg,count,max,min等注意事项窗口函数原则上只能写在select子句中,因为窗口函数是对where或者groupby子句

    2022年10月4日
    3
  • Django(30)Django常用的模板标签

    Django(30)Django常用的模板标签常用的模板标签if标签if标签相当于Python中的if语句,有elif和else相对应,但是所有的标签都需要用标签符号({%%})进行包裹。if标签中可以使用==、!=、<、<=、&

    2022年8月7日
    6

发表回复

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

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