php-工厂模式实现

article/2025/10/16 18:43:56

php-工厂模式实现

概述

工厂模式(Factory Pattern):在工厂模式中,可以根据参数的不同返回不同类的实例。工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

还是拿工厂模式现实中中的例子:

现在有一个摩托车制造厂,它生产踏板摩托和跨骑摩托车,踏板车和跨骑车都是由发动机、车身和轮子组成的。

在工厂模式中,我们把踏板摩托车和跨骑摩托车作为摩托族群中的两个类别,生产引擎、车身和轮子为生产摩托车的固定结构,

模式结构

工厂模式包含如下角色:

  1. MotorcycleFactory-摩托工厂角色:工厂角色负责实现创建所有实例的内部逻辑
  2. Motorcycle:抽象摩托角色:摩托角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
  3. MotorcycleScooter-踏板摩托角色:具体实现踏板摩托车的业务逻辑
  4. MotorcycleStraddle-跨骑摩托角色:具体实现跨骑摩托车的业务逻辑

UML图例

以本文实例代码为参考
在这里插入图片描述

代码实例

<?php
/*** +----------------------------------------------------------------------+* php23种设计模式实现-工厂模式* Author:微信公众号:yuantanphp* 获取更多资源,技术答疑,项目合作请关注微信公众号:yuantanphp* +----------------------------------------------------------------------+*/
//定义一个抽象类
abstract class Motorcycle
{//发动方法public abstract function engine();//车身方法public abstract function body();//车轮方法public abstract function whell();
}
/*** 踏板摩托*/
class MotorcycleScooter extends Motorcycle
{public function engine(){return "MotorcycleScooter-engine";// return "this is Product".$this->product_name;}public function body(){return "MotorcycleScooter-body";}public function whell(){return "MotorcycleScooter-whell";}
}
/*** 跨骑摩托*/
class MotorcycleStraddle extends Motorcycle
{public function engine(){return "MotorcycleStraddle-engine";}public function body(){return "MotorcycleStraddle-body";}public function whell(){return "MotorcycleStraddle-whell";}
}
//摩托工厂类
class MotorcycleFactory
{//创建保存示例的静态成员变量private static $obj;//创建产品public static function createMotorcycle(string $type){switch ($type) {case 'Scooter':self::$obj = new MotorcycleScooter();break;case 'Straddle':self::$obj = new MotorcycleStraddle();break;default:throw new Exception("不能生产的摩托车类型");break;}//最后返回这个实例return self::$obj;}
}
//最后我们使用工厂模式
//跨骑车
$obj = MotorcycleFactory::createMotorcycle('Straddle');
$motoCycleStraddle = array();
$motoCycleStraddle["engine"] = $obj->engine();
$motoCycleStraddle["body"] = $obj->body();
$motoCycleStraddle["whell"] = $obj->whell();
//踏板车
$obj = MotorcycleFactory::createMotorcycle('Scooter');
$motoCycleScooter = array();
$motoCycleScooter["engine"] = $obj->engine();
$motoCycleScooter["body"] = $obj->body();
$motoCycleScooter["whell"] = $obj->whell();echo "踏板摩托车<br>";
var_dump($motoCycleScooter);
echo "<br>";
echo "跨骑摩托车<br>";
var_dump($motoCycleStraddle);

模式分析

  • 将对象的创建和对象业务逻辑处理分离可以降低代码的耦合度,使得两者修改起来相对容易。
  • 工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
  • 工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

模式优点

  • 工厂类含有必有的判断的逻辑,客户端可以根据自身所需传入对应的参数得到对应的对象。
  • 客户端无需知道具体产品类的类名,只需要知道对应所需的参数的即可。

模式缺点

  • 工厂类由于使用了静态工厂方法,造成了工厂角色无法形成继承的等级结构。
  • 由于工厂类集中了众多产品创建逻辑,一旦工厂类出错,则对应的所有产品都会出错。
  • 系统拓展困难,一旦添加新产品不得不修改工厂逻辑,在产品类型过多时。不利于系统的拓展和维护。

适用环境

在以下情况下可以使用简单工厂模式:

  • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
关注微信公众号(yuantanphp)
回复关键字 设计模式 可获取以下材料
《设计模式:可复用面向对象软件的基础》pdf版.
php设计模式23种实例实现php源码
在这里插入图片描述

http://chatgpt.dhexx.cn/article/i9mRvn2C.shtml

相关文章

工厂模式整理

从部分博客摘录过来 定义&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。 个人理解&#xff1a;顾名思义工厂模式就是按照工厂流水线的模式去生成产品&#xff0c;其设计思想就是提取产品的共性去制造流水线&#xff08;接口包含的方法&#x…

Android源码设计模式——工厂模式

工厂模式也是为了构建一个新的对象&#xff0c;它是创建型模式的一种。 Android源码设计模式——Build模式&#xff08;应用&#xff1a;AlertDialog源码分析&#xff09; 上述是之前的Build模式&#xff0c;也是创建型模式一种&#xff0c;不懂的小伙伴可以回看下上篇博客。 …

设计模式 -- 工厂模式

工厂的指责就是制作产品&#xff0c;那么产品就可以理解为是我们的对象&#xff0c;而工厂就是为了实例化对象而对象的&#xff0c;根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建&#xff0c;是一种创建型模式。 1、简单工厂模式 简单…

Vue轮子-Lottie-动画实现

不要问为什么 没有为什么。浮躁的7月首周。Keep Going And Stay Strong。 Lottie是一个IOS&#xff0c;Android和React Native库&#xff0c;可以实时渲染动画&#xff0c;动画被转化成JSON文件&#xff0c;节省了很多资源&#xff0c;允许应用程序像使用静态图像一样轻松使用…

java造轮子_RxJava 自己造轮子一

RXJava 造轮子 什么是rxjava? rxjava 是一个响应式编程&#xff0c;为了更好更优雅的处理异步时间&#xff0c;内部实现原理是观察者模式 自己造轮子实现Rxjava 观察者模式核心有两个&#xff0c;一个观察者一个被观察者 先创建一个被观察者observer(基层抽象类) //观察者的基…

react hook 造轮子

GitHub地址:https://github.com/rayhomie/rayhomieUI 一、sass的使用 1、import方式引入scss文件&#xff0c;后面必须带后缀名scss import "main.scss";2、Partials方式引入base.scss文件,文件必须以&#xff08;下划线&#xff09;开头&#xff0c;可以不用带后…

「轮子工厂」谭庆波,很高兴认识大家!

我是谁&#xff1a; 我叫谭庆波&#xff0c;网名厂长。 首先我是一名学生&#xff0c;哈工大计算系的博士生&#xff0c;也是一个喜欢在互联网上折腾的95后。 2015年开始写博客&#xff0c;累计输出博客500多篇&#xff0c;访问量超百万&#xff1b; 2018年开始做公众号和知乎&…

前端轮子厂

1. Element Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库&#xff0c;手机端有对应框架是Mint UI 。 中文文档&#xff1a;http://element-cn.eleme.io/#/zh-CN github地址…

前端_Vue_1.初识Vue

文章目录 一、前言二、开始1 简介1.1 什么是Vue&#xff1f;1.2 渐进式框架1.3 单文件组件1.4. API风格1.4.1. 选项式API&#xff08;Options API&#xff09;1.4.2. 组合式API&#xff08;Composition API&#xff09;1.4.3. 该选哪个&#xff1f; 2. 快速上手&#xff08;学前…

Nginx-学习一

什么是Nginx Nginx是一个http服务器。 是一个使用c语言开发的高性能的http服务器及反向代理服务器。 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发&#xff0c;官方测试ngin…

Nginx学习二

文章目录 一、proxy_set_header1.1、<span class"katex--inline">http\_host与</span>host区别1、在使用Nginx做反向代理的时候&#xff0c;proxy_set_header功能可以设置反向代理后的http header中的host&#xff0c;1.1.1、 不设置 proxy_set_header H…

nginx学习一

nginx 安装&#xff1a; 1、 ./configure 如果报错 error: C compiler cc is not found 如果没有安装就安装:yum install –y gcc 如果还报错看看是不是安装: yum install –y zlib zlib-devel 2、 安装 make 3、 make install 4、 安装完后可以查看到目录 5、 启动 nginx …

nginx学习记录

一、docker安装nginx和配置文件 &#xff08;1&#xff09;docker拉取镜像 docker pull nginx &#xff08;2&#xff09;创建容器 # 在/root⽬录下创建nginx⽬录⽤于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf # 在~/nginx/conf/下创建nginx.conf⽂件…

尚硅谷nginx学习笔记

尚硅谷nginx学习笔记 1.nginx相关概念1.1什么是nginx&#xff1f;1.2正向和反向代理1.3负载均衡1.4动静分离 2.nginx在linux中的安装与启动3.nginx的常用命令4.nginx的配置文件5.nginx配置实例5.1反向代理准备工作5.2反向代理实例一5.3反向代理实例二5.4负载均衡实例5.5动静分离…

Nginx学习(一)

系统版本CentOS Linux release 7.6.1810 (Core) Nginx作用 反向代理正向代理负载均衡HTTP服务器(包含动静分离) 环境确认 1.关闭iptables规则 如果启动的iptables防火墙不想关闭的话&#xff0c;可以通过iptables -F 来清除防火墙关闭。然后通过iptables -L查看 2.停用seli…

NGINX学习记录-基础入门篇

学习《NGINX 经典教程》林静&#xff0c;刘旭峰&#xff0c;章澍&#xff0c;廖健雄&#xff0c;宗兆伟 ... 著 目录 一、Nginx优点 二、功能(应用场景) 反向代理。 负载均衡 静态缓存 Web服务器 安全和访问控制 三、nginx安装 四、启动、停止和重载nginx 五、配置文…

Nginx学习总结(1):Nginx简介

(最近&#xff0c;部门组织了好几个技术兴趣小组&#xff0c;对当前的热门技术进行研究。我加入了Nginx学习小组&#xff0c;与几个同事一道围绕Nginx来进行研究和学习。从今天起&#xff0c;我会陆陆续续发一系列有关Nginx的学习总结。本文是系列之一&#xff1a;Nginx简介。)…

学习nginx

Nginx笔记 安装nginxwget -c https://nginx.org/download/nginx-1.20.1.tar.gz1、创建软链路ls /usr/local/nginx/sbin/nginx /usr/bin/ 2、前端部署配置 Conf 在这里插入图片描述 3、启动服务 由于软链路 可以直接 nginx 启动&#xff08;任意目录&#xff09; 停止 nginx -s…

nginx学习日记

nginx介绍 1.什么是nginx? nginx就是c语言开发的一个高性能HTTP和反向代理Web服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 nginx是轻量级的。 2.什么是反向代理&#xff1f; 代理服务可以简单的分为正向代理和反向代理。 正向代理&#xff1a;就是代理…

Nginx学习笔记总结:初次认识 Nginx

2022 年 4月 16 日 百思不得小赵 &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1141天。觉得有帮助麻烦&#x1f44f;点赞、&#x1f340;评论、❤️收藏啦。 概述 Nginx是一个高性能…