php工厂模式

php工厂模式定义:我们只需要提供一个创建对象实例的功能,而无需关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。一、简单工厂模式(平时开发中基本上简单工厂模式就够用了)说明: Api:定义客户所需要的功能接口(后面具体实现的类基本上就根据这个来) Impl:具体实现Api的实现类,一般有多个, Factory:工厂,选择合适的实现类来创建Api接…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

定义:我们只需要提供一个创建对象实例的功能,而无需关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。

一、简单工厂模式(平时开发中基本上简单工厂模式就够用了)

php工厂模式

说明:

  • Api: 定义客户所需要的功能接口(后面具体实现的类基本上就根据这个来)

  • Impl: 具体实现Api的实现类,一般有多个,

  • Factory: 工厂,选择合适的实现类来创建Api接口对象(对外暴露

  • Client: 客户端,通过Factory 来获取Api接口对象,然后面向Api接口编程

工厂方法命名规则建议:

  • 对外开放的类命名建议为“模块名称+Factory”,比如,用户模块的工厂就称为UserFactory

  • 方法名称通常为“get+接口名称”或者是“create+接口名称”。比如用户接口名称为UserEbi,那么方法名称通常为getUserEbi或者createUserEbi。

简单工厂方法的内部主要实现的功能是“选择合适的实现类”,选择条件或者是参数的来源通常为一下集中:

  1. 来源于客户端,由Client来传入参数

  2. 来源于配置文件,从配置文件获取用于判断的值

  3. 来源于程序运行期的某个值,比如从缓存中获取某个运行期的值

简单工厂的优缺点:

优:使用户不用关心具体类的实现以及调用。

缺:未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。

二、普通工厂模式:
php工厂模式

优缺点:

优点:当有新的产品需要加进来时不需要新增改变底层当类,可以直接继承接口,外部实现就可以了;

缺点:外观上看起来比简单工厂复杂。

三、抽象工厂模式:

特点:抽象工厂模式围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

应用实例:在之前的例子中一次调用只会涉及到一个工厂,但是有些复杂的场景必须要几个工厂一起协作的,比如我们吃饭,需要基本的碗和筷子,碗和筷子本身是两个工厂类,但是在吃饭上关联在一起了,这时候我们在调用碗的时候同时也必须使用筷子,

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

实例:

AbstractFactory.php

<?php

namespace DesignPatterns\Creational\AbstractFactory;

/**
 * 在这种情况下,抽象工厂是创建一些组件的契约
 * 在 Web 中。 有两种呈现文本的方式:HTML 和 JSON
 */
abstract class AbstractFactory
{
    abstract public function createText(string $content): Text;
}

JsonFactory.php

<?php

namespace DesignPatterns\Creational\AbstractFactory;

class JsonFactory extends AbstractFactory
{
    public function createText(string $content): Text
    {
        return new JsonText($content);
    }
}

HtmlFactory.php

<?php

namespace DesignPatterns\Creational\AbstractFactory;

class HtmlFactory extends AbstractFactory
{
    public function createText(string $content): Text
    {
        return new HtmlText($content);
    }
}

Text.php

<?php

namespace DesignPatterns\Creational\AbstractFactory;

abstract class Text
{
    /**
     * @var string
     */
    private $text;

    public function __construct(string $text)
    {
        $this->text = $text;
    }
}

JsonText.php

<?php

namespace DesignPatterns\Creational\AbstractFactory;

class JsonText extends Text
{
    // 你的逻辑代码
}

HtmlText.php

<?php

namespace DesignPatterns\Creational\AbstractFactory;

class HtmlText extends Text
{
    // 你的逻辑代码
}

1.1.4. Test

Tests/AbstractFactoryTest.php


<?php

namespace DesignPatterns\Creational\AbstractFactory\Tests;

use DesignPatterns\Creational\AbstractFactory\HtmlFactory;
use DesignPatterns\Creational\AbstractFactory\HtmlText;
use DesignPatterns\Creational\AbstractFactory\JsonFactory;
use DesignPatterns\Creational\AbstractFactory\JsonText;
use PHPUnit\Framework\TestCase;

class AbstractFactoryTest extends TestCase
{
    public function testCanCreateHtmlText()
    {
        $factory = new HtmlFactory();
        $text = $factory->createText('foobar');

        $this->assertInstanceOf(HtmlText::class, $text);
    }

    public function testCanCreateJsonText()
    {
        $factory = new JsonFactory();
        $text = $factory->createText('foobar');

        $this->assertInstanceOf(JsonText::class, $text);
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164355.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UCloud出海记:神秘的东南亚云计算赛道,还没到划地盘的阶段 …

    UCloud出海记:神秘的东南亚云计算赛道,还没到划地盘的阶段 …

    2021年6月19日
    118
  • ReadProcessMemory会被检测到吗?_仅完成部分readprocess如何解决

    ReadProcessMemory会被检测到吗?_仅完成部分readprocess如何解决ReadProcessMemory从特定进程的内存里读取数据。被读取的整个位置应该是可读的否则操作会失败。BOOLWINAPIReadProcessMemory(__in  HANDLEhProcess,__in  LPCVOIDlpBaseAddress,__out LPVOIDlpBuffer,__in  SIZE_TnSize

    2022年10月4日
    4
  • 如何免费的、完整的把 PDF 转换为 Word?

    如何免费的、完整的把 PDF 转换为 Word?先给大家打个预防针:由于PDF文件本身的特性,想要百分百完美地将它转回Word格式基本上是不可能的!我们都知道PDF是一种不能编辑的文件,如果要将pdf文件转换成word文件又该怎样转换呢?其实我们可以借助工具实现pdf转换成word的操作哦。你有没有遇到过要将PDF转换为Word需求的时候,找了一大堆工具,进行转换发现有一些转换不了,有一些转换限制,需要付费才能全部转换完成。我最近也是遇到有一个需求需要将PDF转换为Wold,找了好几个工具都是收费的(因为只是转换一两次,没必要充个会员,不.

    2022年6月12日
    39
  • pycharm调试python_以下属于程序调试的内容有

    pycharm调试python_以下属于程序调试的内容有1.准备代码:#coding=utf-8classTestDebug:def__init__(self):self.a=1…

    2022年8月28日
    6
  • 软件测试流程设计—黑盒测试用例设计方法「建议收藏」

    软件测试流程设计—黑盒测试用例设计方法「建议收藏」第1章测试用例设计方法测试用例设计方法包括黑盒测试用例设计方法和白盒测试用例设计方法,下面分别进行介绍。1.1黑盒测试用例设计方法黑盒测试用例设计方法包括等价类划分法、边界值分析法、判定表法、因果图法、正交试验法、状态迁移图法、流程分析法、输入域测试法、输出域分析法、异常分析法和错误猜测法等,下面进行详细介绍。1.1.1 等价类划分法1.什么是等价类划分法等价类划分法是一种典型的黑盒测试设计方法。该方法主要针对测试子项进行规格分析,然后获得用例,而不用对系统内部处理进行深..

    2022年6月1日
    32
  • pycharm代码运行不显示结果_pycharm运行配置错误

    pycharm代码运行不显示结果_pycharm运行配置错误我最近看了两节关于数据分析的课程,其中最基础也最重要的知识就是支持度,置信度和提升度了。而在打印提升度的相关信息时,我遇到了一些麻烦!老师用的是JupyterNotebook来演示,而我用的是pycharm(其实跟编译器没关系),然后打印提升度时我发现有很多数据我无法打印出来!只是给我留了半串省略号…我就纳闷了,到底是啥原因?shopping_basket={‘ID’:[1,2,3,4,5,6],’Basket’:[[‘Onion’,’Bee

    2022年8月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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