实施工厂模式的正确方法是什么?

2024-01-12

我只是想知道这是否是在 PHP 中创建对象和实现工厂模式的正确方法。我知道我们有工厂方法模式和抽象工厂模式,但是我们有像下面这样的模式吗http://noondreams.com/shared/data/pages/images/Factory.png http://noondreams.com/shared/data/pages/images/Factory.png ?

class Factory
{
 public function make($format)
 {
    switch($format)
    {
        case Source::Assocs:
            return new \Source\Formats\Assocs();
        case Source::XML
            return new \Source\Formats\XML();
        //Some other formats
    }
 }
}

不,这并不是真正的工厂模式。工厂模式看起来更像是这样的:

<?php
abstract class File
{
    public static function createFromFile($filename)
    {
        $extension = /* get file extension */;

        switch ($extension)
        {
            case 'xml':
                return new XmlFile($filename);
                break;
            case 'php':
                return new PhpFile($filename);
                break;
        }

        throw new \InvalidArgumentException();
    }
}

class XmlFile extends File
{

}

class PhpFile extends File
{

}

请注意抽象类如何创建具体类的实例来扩展它,而用户不必担心它可能返回的各种类型。

Note:在实际场景中,您不会使用 switch 语句,但可能会使用反射或各种其他技术,因为抽象类不知道它的所有子类。

这可能看起来更像这样:

<?php
abstract class File
{
    public static function createFromFile($filename)
    {
        $extension = /* get file extension */;
        $extension = ucfirst($extension);

        $reflection = new ReflectionClass($extension . 'File');
        return $reflection->newInstanceArgs(array($filename));
    }
}

class XmlFile extends File
{

}

class PhpFile extends File
{

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实施工厂模式的正确方法是什么? 的相关文章

  • 显示表中的记录

    我的第一个 PHP 项目遇到了一些麻烦 我试图从 MySQL 数据库 有 3 条记录 获取数据并将其显示在表格中 问题是它似乎只显示记录 2 和 3 它跳过了第 1 条记录 请参阅我的代码并在下面显示 if mysqli connect e
  • 为什么我不能在 TCPDF 表中使用 č,ć,đ 图表?

    我正在为我的网站构建一个 tcpdf 文件 该 tcpdf 文件中有一个包含一些数据的表格 但我无法使该章程正常工作 对于编码 我使用 windows 1250 宪章女巫不起作用 我已经尝试过 utf 8 但仍然没有得到这个章程 tcpdf
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • facebook php - 如何获取专辑封面照片

    我需要使用 PHP SDK Facebook 获取专辑封面照片 我尝试 https graph facebook com ALBUM ID picture type album 但我得到默认图像 例如 获取用户 https graph fa
  • 基于 Typeof 的工厂或者是

    下面的代码有什么更优雅的方法 我想根据另一个类的类型返回派生类 if option is Rectangle modelInputs new Foo else if option is Circle modelInputs new Bar
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • PHP Solr PECL 扩展安装

    我已经使用命令安装了 pecl solr pecl install solr 和梨使用 wget http pear php net go pear phar php go pear phar 重启Apache后 我仍然收到错误 Fatal
  • 语法错误,第 288 行出现意外的“endif”(T_ENDIF)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在离线处理我的 WordPress 网站的此代码错误 解析错误 语法错误 homez 541 photoher marie
  • fgetcsv 在特定行打开?

    有没有办法使用 fgetcsv 在特定行上打开 我有一个非常大的 csv 想通过 ajax 一次运行大约 100 行 我可以轻松停止 while 循环 但如何在特定行上打开 或者这是不可能的 从第 100 行开始读取没有简单的方法 但您可以
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 强制 Composer 下载 git repo 而不是 zip

    我对作曲家有一些问题 require php gt 5 3 2 kriswallsmith buzz 0 7 Repo https github com kriswallsmith Buzz tree v0 7 https github c
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 自动建议 php 的 ajax

    我有一个 html 表单 php 脚本和 jquery 我需要一个 ajax 代码来从我的 php 脚本中进行自动建议 以下是代码 表单 html
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio

随机推荐

  • 如何通过引用分配lua变量

    如何在Lua中通过引用将一个变量分配给另一个变量 例如 想要执行相当于 a b 的操作 其中 a 将是指向 b 的指针 背景 有一个案例 我实际上有这样的事情 local a b c d e f g lots of variables if
  • 从容器重建 docker run 命令参数

    最好的重建方法是什么docker run来自现有 docker 容器的命令参数 我可以用docker inspect并使用在那里找到的信息 还有更好的办法吗 不是很容易 但是您可以通过格式化输出来做到这一点docker inspect 对于
  • C++ list::sort 的自定义比较函数

    您好 我在编译一段简单的代码时遇到问题 我正在创建一个实现一副纸牌的类 并且我想使用 list short 方法创建一个洗牌方法 相关代码 deck h ifndef DECK H define DECK H include
  • Git:配置 difftool 和 mergetool 的模式

    在 Mercurial 中 可以为外部差异和合并工具定义一种模式 以便仅针对与指定模式匹配的文件调用它们 diff patterns ext difftool merge patterns ext mergetool 如何在 Git 中定义
  • HasDbFunction,没有映射实体类的表值函数

    到目前为止我发现的所有内容 如果您调用表值函数 则返回值必须是 IQueryable 例如 public IQueryable
  • 使用 Scapy 与 C 套接字对话

    我有一个 UDP 连接并在端口 localhost 上侦听 并且我也尝试从 localhost 发送 Scapy 数据包 由于某种原因 我的 C 代码从未真正捕获数据包 但我可以很好地看到数据包显示在 Wireshark 中 我已经有一段时
  • 浮点计算使用 float 给出的结果与使用 double 给出的结果不同

    我有以下代码行 hero gt onBeingHit ENEMY ATTACK POINT 1 0 hero gt getDefensePercent void onBeingHit int decHP 方法接受整数并更新健康点 float
  • WPF ListView 在处理大数据时性能非常差

    我在 WPF 中使用 ListView 时遇到性能非常差的情况 使用大约 30000 条记录 据我所知 虚拟化应该打开 因为这是默认设置 我什至在 XAML 中显式打开它 表现不佳的表现是这样的 初始绑定非常慢 几分钟 滚动速度非常慢 超过
  • 单击将中止进一步执行,因为 Python 3 被配置为使用 ASCII 作为环境编码

    我将 Quokka Python Flask CMS 下载到 CentOS7 服务器上 通过命令一切正常 sudo python3 manage py runserver host 0 0 0 0 port 80 然后我创建一个文件 etc
  • 根据屏幕尺寸更改标签尺寸 xamarin 表单

    我正在使用 xamarin forms 来做一个应用程序 我发现使用相同的大小来向 ios 设备发送字母是行不通的 在 7 plus 上它运行良好 但在 iphone 5 上它对于屏幕大小来说是一个大字母 有人知道如何制作具有可缩放尺寸的字
  • 如何让javascript忽略转义(\)字符? [复制]

    这个问题在这里已经有答案了 qAnswersR 90430 qAnswersR 90430 push math k frac x 20 2 256 frac y 15 2 81 1 math 我需要将值放入变量中 但是当我像这样 conso
  • rtrim 函数不适用于结尾 h 字母[重复]

    这个问题在这里已经有答案了 file refinish php folder rtrim file php echo folder refinis 哪里结束h 我尝试了其他一些结尾字母 没关系 rtrim 不会删除您在第二个参数中指定的字符
  • x86-64 汇编的性能优化 - 对齐和分支预测

    我目前正在编写一些 C99 标准库字符串函数的高度优化版本 例如strlen memset 等 使用带有 SSE 2 指令的 x86 64 汇编 到目前为止 我已经在性能方面取得了出色的结果 但当我尝试进一步优化时 有时会出现奇怪的行为 例
  • Shapeless 中 Nat 类型的限制

    在无形中 Nat 类型代表了一种在类型级别对自然数进行编码的方法 例如 这用于固定大小的列表 您甚至可以在类型级别上进行计算 例如附加一个列表N列表中的元素K元素并返回一个在编译时已知的列表N K元素 Is this representat
  • JPA中@Table注解有什么用?

    使用这些注释的全部目的是独立于数据库提供者 而不是重新生成 JAR 存档 如果我硬核 Table name myDatabase myTableName 我一开始就不明白使用 hibernate 的意义 如果我决定切换到不同的数据库提供商
  • 如何在for循环(Python)中写入txt文件?

    作为一个简单的练习 我试图将最多 500 个素数打印到一个文本文件中 但我不确定如何正确地将写入代码插入到 for 循环中 当前输出的只是最后一个素数 在本例中为 499 for num in range 2 500 prime True
  • Matplotlib Line3DCollection 用于随时间变化的颜色

    我正在尝试绘制随时间演变的 3D 线轨迹 并且我希望颜色发生变化以显示时间的流逝 例如从浅蓝色到深蓝色 然而 明显缺乏使用 matplotlib 的教程Line3DCollection 这是最接近的 https stackoverflow
  • 对 WebService 的 jQuery 调用返回“无传输”错误

    我有以下网络服务 WebMethod public string HelloWorld return Hello World 它是库存标准 没有对类装饰器进行任何更改 我有这个 jQuery 方法 var webMethod http lo
  • SimpleDateFormat 格式错误的值

    以下代码 SimpleDateFormat sdf new SimpleDateFormat MM dd System out println sdf format new Date 1293253200 12 25 2010 05 00
  • 实施工厂模式的正确方法是什么?

    我只是想知道这是否是在 PHP 中创建对象和实现工厂模式的正确方法 我知道我们有工厂方法模式和抽象工厂模式 但是我们有像下面这样的模式吗http noondreams com shared data pages images Factory