php工厂模式

在PHP中,工厂模式是一种创建型设计模式,用于将对象的创建过程封装到一个单独的类(即工厂类)中。通过使用工厂模式,客户端代码不需要知道如何实例化具体的产品类,而是直接与抽象接口或工厂进行交互,从而获得所需产品对象。

以下是一个简单的PHP工厂模式练习示例,我们创建一个工厂来生成不同类型的动物:

1. 首先定义一个抽象的Animal接口或者抽象基类:

// Animal.php
abstract class Animal
{abstract public function makeSound(): string;
}

2. 创建几个实现了Animal接口的具体动物类:

// Dog.php
class Dog extends Animal
{public function makeSound(): string{return "Woof!";}
}// Cat.php
class Cat extends Animal
{public function makeSound(): string{return "Meow!";}
}

3. 现在创建一个工厂类AnimalFactory来根据传入的类型字符串生成对应的动物实例:

// AnimalFactory.php
class AnimalFactory
{public static function createAnimal(string $type): ?Animal{switch ($type) {case 'dog':return new Dog();case 'cat':return new Cat();default:// 当输入不合法时返回null或其他错误处理方式return null;}}
}

4. 在客户端代码中使用工厂来创建动物实例并调用方法:

// client.php
require_once 'Animal.php';
require_once 'Dog.php';
require_once 'Cat.php';
require_once 'AnimalFactory.php';$animalType = 'dog'; // 或从用户输入、配置文件等获取$animal = AnimalFactory::createAnimal($animalType);if ($animal !== null) {echo $animal->makeSound(); // 输出: Woof!
} else {echo "无法创建未知类型的动物";
}

这个练习展示了如何根据传入的不同参数动态地创建不同类型的对象,这就是简单工厂模式的基本应用。当然,在实际项目中,工厂可能更加复杂,包含更多的逻辑和验证步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MapStruct 使用

MapStruct最详细的使用教程,别在用BeanUtils.copyProperties () mapstruct使用和详解 项目背景 之前查看网上别人写的文章,很多都提到了BeanUtils(org.springframework.beans) 利用反射性能比较差。大家都推荐使用 MapStruct。因为这个组件使用 Java 原…

zookeeper 应该这样学

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分…

C# 使用 MailKit 接收邮件(附demo)

C# 使用 MailKit 接收邮件(附demo) 介绍安装包(依赖)案例简单代码 获取附件核心代码完整代码 介绍一下POP3 介绍 MailKit 是一个开源的 C# 邮件处理库,用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使…

Redis核心技术与实战【学习笔记】 - 6.Redis 的统计操作处理

1.前言 在 Web 业务场景中,我们经常保存这样一种信息:一个 key 对应了一个数据集合。比如: 手机 APP 中的每天用户登录信息:一天对应一系列用户 ID。电商网站上商品的用户评论列表:一个商品对应了一些列的评论。用户…

【云原生之kubernetes系列】--污点与容忍

污点与容忍 污点(taints):用于node节点排斥Pod调度,与亲和效果相反,即taint的node排斥Pod的创建容忍(toleration):用于Pod容忍Node节点的污点信息,即node节点有污点,也将新的pod创建…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16:系统负载指数5. Processes: 1096系统正在运…

【AI视野·今日Robot 机器人论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 15 Jan 2024 Totally 14 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Learning Joint Space Reference Manifold for Reliable Physical Assistance Authors Amirreza Razmjoo, Tilen Brecelj, Kri…

【智能家居入门4】(FreeRTOS、MQTT服务器、MQTT协议、微信小程序)

前面已经发了智能家居入门的1、2、3了,在实际开发中一般都会使用到实时操作系统,这里就以FreeRTOS为例子,使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机,系统实时性强了很多,小程序下发…

Cache Lab:Part B(52.6/53分)【矩阵转置的分块算法】

目录 任务描述 32 32 baseline try1:给对角线上的块再次细分块 try2:对角块依次错位 成功:对角块两两交换 成功:其他方法 64 64 baseline 对角线优化普通块转置顺序调整(7.6/8分) 61 67 成…

Vue3+vite搭建基础架构(3)--- 使用dayjs

Vue3vite搭建基础架构(3)--- 使用dayjs 说明官方文档vite.config.js别名配置安装dayjs安装命令 使用dayjs将dayjs封装为自己的日期工具类使用dataUtil.js日期工具类示例 说明 这里记录下自己在Vue3vite的项目使用dayjs的过程,不使用ts语法&a…

最新XC主题 支持六种主题样式 去除域名授权全解密源码 一款多样式主题

Typecho 最新XC主题 去除域名授权全解密源码 这是一款多样式主题,首页支持六种主题样式,支持Pjax优化访问速度,多种单页,如友链、说说等。评论支持表情,自定义编辑器,支持其他样式功能。该主题功能性挺高&…

SQL中的left join和right join及具体实例

LEFT JOIN(或称为左连接)是SQL中的一种连接类型,它用于从两个或多个表中基于共同的列将数据组合起来。在使用LEFT JOIN时,查询的结果集包含左表(LEFT JOIN语句中指定的第一个表)的所有记录,以及…

音视频数字化(音频数字化)

在音视频领域,人们始终追求无限还原现场效果,因此音频越逼真越好,视频越清晰越好。之所以我们需要将音视频信号由模拟转为数字,目的是在录制、存储、编辑、复制、回放等环节的不失真,尽量保持原有细节,不因以上操作,导致音画的质量下降。 为此,视频系统分辨率越来越高,…

【Java程序设计】【C00207】基于(JavaWeb+SSM)的宠物领养管理系统(论文+PPT)

基于(JavaWebSSM)的宠物领养管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物领养系统 本系统分为前台系统、管理员、收养者和寄养者4个功能模块。 前台系统:游客打开系统…

k8s-HPA

前提条件 安装有**Metrics Server**,HPA的运行监控指标需要由Metrics Server 提供 文档:https://github.com/kubernetes-sigs/metrics-server?tabreadme-ov-file#readme 快速自动缩放,每15秒收集一次指标(可配置)。 资源效率,为集群中的每…

网络防御安全:2-6天笔记

第二章:防火墙 一、什么是防火墙 防火墙的主要职责在于:控制和防护。 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 二、防火墙的发展 区域: Trust 区域,该区域内网络的受信任程度高,通常用来定义内部…

计算机中的缓存与内存

在现代计算机系统中,缓存和内存扮演着至关重要的角色,它们共同协作以实现高性能和高效率的数据处理。本文将深入探讨缓存和内存的概念、功能以及它们在计算机系统中的作用。 缓存与内存:概念与功能 1. 内存(RAM)&…

代码随想录算法训练营第三十二天| 738.单调递增的数字 ,968.监控二叉树

738.单调递增的数字 代码随想录 从后往前遍历 class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] chars s.toCharArray();int start s.length();for (int i s.length() - 2; i > 0; i--) {if (chars[i] > chars[i 1…

数据库管理-第142期 DBA?DBA!(20240131)

数据库管理142期 2024-01-31 数据库管理-第142期 DBA?DBA!(20240131)正文总结 数据库管理-第142期 DBA?DBA!(20240131) 作者:胖头鱼的鱼缸(尹海文&#xff09…

VSCode 设置代理

Open Visual Studio Code, click the settings icon in the lower left corner, and click Settings.