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)


相关推荐

  • 基于STM32的RFID-RC522门禁系统

    设计介绍这是一个基于STM32的RFID-RC522门禁系统,LCD1602显示当前状态,当检测到IC卡时,如果这个IC卡已经登记过,LCD1602上会显示IC卡的卡号,继电器打开,如果没有登记则报警。部分代码如下,需要源码的朋友可以在文章下方链接下载。#include”sys.h”#include”delay.h”#include”lcd.h”#include”led.h”#…

  • qmake:配置qmake

    qmake:配置qmake一、属性qmake有一个持久化配置系统,它允许在qmake中设置一次属性,并在每次调用qmake时查询它。可以在qmake中设置一个属性:qmake-setPROPERTYVALUE您可以从qmake检索此信息,如下所示:qmake-queryPROPERTYqmake-query//列出内置属性以下是内置属性:QMAKE_SPEC:在主机构建期间解析并存储在QMAKESPEC变量中的主机mkspec的短名称

  • Java基础入门笔记02——文档注释,JavaDos文件,数据类型,类型转换,变量默认值问题

    Java基础入门笔记02——文档注释,JavaDos文件,数据类型,类型转换,变量默认值问题科普文字maven 约定大于配置maven整合了所有jar包springBoot整合了所有框架IDEA进行优化 百度看下 快捷键2021.11.13文档注释javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。用于解释包或者方法或者类的作用//JavaDoc:文档注释 /** */package com.baidu.www.base;/** * @author tim 作者名 * @versio

  • 闭关六个月整理出来的微机原理知识点(特别适用河北专接本)

    闭关六个月整理出来的微机原理知识点(特别适用河北专接本)笔者准备过程中的总结,是通过填空题,简答题等等总结出来的如有不足,还望大佬们指教A14运算器和控制器又称为中央处理器(CPU)。计算机由运算器控制器存储器输入设备输出设备五大部分组成。根据传送的信息类型,系统总线可以分为三类:数据总线地址总线控制总线8086CPU由总线接口部件BIU执行部件EU组成。半导体存储器按存取方式不同,分为读写存储器RAM只读存储器ROM。读写存储器RAM指可以随机地、个别地对任意一个存储单元进行读写的存.

  • iPhone屏幕尺寸(包含7p)

    iPhone屏幕尺寸(包含7p)转自:http://blog.csdn.net/jeikerxiao/article/details/52768269px与pt区别字体大小的设置单位,常用的有2种:px、pt。这两个有什么区别呢?先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点;pt就是point,是印刷行业常用单位,等于1/72英寸。px全称为p

  • Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话。不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多高手喜欢把自己的经验写在网上,供大家来学习,我也是从中受惠了很多,在此我深表感谢。可是我发现我却从来没有将自己平时的一些心得拿出来与大家分享,共同学习,太没有奉献精神了。于是我痛定思痛,决定从今天开始写博客,希望可以指点在我后面的开发者,更快地进入Android开发者的行列当中。好了,废话就说这么多,下面开始

发表回复

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

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