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(联系人)的功能,这就是增加产品族了,我把类图写上来吧,省的写代码了,而且也更清楚一些。
这里写图片描述

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • thread中join和detach的区别

    thread中join和detach的区别C++中的thread对象通常来说表达了执行的线程(threadofexecution),这是一个OS或者平台的概念。当thread::join()函数被调用,调用它的线程会被block,直到线程的执行被完成。基本上,这是一种可以用例知道一个线程已结束的机制。当thread::join()返回时,OS的执行的线程已经完成,C++线程对象可以被销毁。当thread::detach()函数

  • oracle修改用户密码永不过期_oracle查看密码过期时间

    oracle修改用户密码永不过期_oracle查看密码过期时间Oracle用户登录密码过期的修改1、查看用户的proifle是哪个,一般是default:sqlgt;SELECTusername,PROFILEFROMdba_useOracle用户登录密码过期的修改1、查看用户的proifle是哪个,,一般是default:sql>SELECTusername,PROFILEFROMdba_users;2、查看指定概要文件(如defau…

  • Excel解密——okfone解密大师

    Excel解密——okfone解密大师Excel工作表为了保护数据,设置了打开密码,时间久了就把密码忘记了,这种情况该怎么办。这个情况可以考虑使用解密软件帮你将工作簿密码找回。okfoneExcel解密大师可以解决密码忘记的问题,使用教程如下:打开okfoneExcel解密大师,点击【找回密码】将Excel文件添加进去,选择找回方法,然后点击【开始】密码找回成功就会在软件界面上显示![…

  • 滴滴的大数据可视化效果「建议收藏」

    滴滴的大数据可视化效果「建议收藏」前言上一篇专门针对mobike的空间可视化效果写了一篇总结,本篇主要基于滴滴的大数据可视化做一个描述,上篇介绍的空间可视化效果偏静态的,滴滴的大数据可视化更加动态,形式上也更加丰富多彩,本篇主要参考了这篇文章:http://baijiahao.baidu.com/s?id=1588178807086352632和《滴滴出行2017年度城市交通出行报告》。蝌蚪图通过“蝌蚪图”,滴滴大数据…

  • pb数据库连接_jdbc连接mysql中文乱码

    pb数据库连接_jdbc连接mysql中文乱码最近需要用pb联mysql做个项目,查网上有关的方法,很多都没说清楚,所以在这里总结下:  采用JDBC连接,首先去MYSQL官网下载mysql-connector-java-5.0.7.rar JDBC驱动打开PB,菜单Tools–>systemoptions,打开JAVA选项,点击新增文件(白色文件图标)选择刚解压的mysql-connector-java

  • thread继承Runnable吗_不能完全和完全不能的区别

    thread继承Runnable吗_不能完全和完全不能的区别  在实际工作中,我们很可能习惯性地选择Runnable或Thread之一直接使用,根本没在意二者的区别,但在面试中很多自以为是的菜货面试官会经常而且非常严肃的问出:请你解释下Runnable或Thread的区别?尤其是新手就容易上当,不知如何回答,就胡乱编一通。鄙人今天告诉你们这二者本身就没有本质区别,就是接口和类的区别。问出这个问题的面试官本身就是个二流子!如果非要说区别,请看如下:Run…

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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