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


相关推荐

  • 数据结构 单一列表

    数据结构 单一列表

    2022年1月7日
    47
  • 远程连接opc服务器设置[通俗易懂]

    远程连接opc服务器设置[通俗易懂]准备工作1.1软件基础(1)安装所需的软件,机器上有必要的OPCclient、OPCServer,如ifix,rslinx,保证rslinx的版本能支持远程opc功能。1.2通讯基础(1)在同一局域网内,能ping通(物理连接,处于同一网段下)(2)建立同名用户及相同密码,win7系统将用户放置于于distributedCOMUser下,若是XP系统,则开启来宾用户…

    2022年6月20日
    23
  • node.js win7环境搭建与基本测试

    node.js win7环境搭建与基本测试

    2021年9月9日
    58
  • 通过pycharm安装python_JAVA开发环境

    通过pycharm安装python_JAVA开发环境Python开发环境搭建与helloWorld测试1.去官网下载然后傻瓜式安装2.下载开发IDE:这里选用pychram下载地址:pychram官网新建一个工厂后写简单的helloworld然后:找到你工程的文件,Helloworld.py最后点击OK即可看运行结果:pycha…

    2022年8月27日
    3
  • Angularjs 服务

    Angularjs 服务AngularJS服务(Service):www.runoob.com/angularjs/angularjs-services.htmlAngularJS内建了30多个服务。官网搜索service吧https://docs.angularjs.org/api/ng/service/$window$http是AngularJS应用中最常用的服务。服务向服务器发送请求,应用响应服…

    2022年7月25日
    7
  • mysql 端口号_mysql的端口号(mysql常用端口号)「建议收藏」

    mysql的端口号(mysql常用端口号)2020-05-0721:58:15共10个回答mysql的默认端口号是多少mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf如何查看mysql的端口号1使用命令showglobalvariableslike’port’;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参…

    2022年4月18日
    399

发表回复

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

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