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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 实现MyBatis批量插入

    ServiceintcreateList(List<ProductDeviceEntity>roductDeviceEntityList);ServiceImpl @Override publicintcreateList(List<ProductDeviceEntity>roductDeviceEntityList){ log.info(…

    2022年4月9日
    51
  • python jieba库_Python jieba库的使用说明「建议收藏」

    python jieba库_Python jieba库的使用说明「建议收藏」1、jieba库基本介绍(1)、jieba库概述jieba是优秀的中文分词第三方库-中文文本需要通过分词获得单个的词语-jieba是优秀的中文分词第三方库,需要额外安装-jieba库提供三种分词模式,最简单只需掌握一个函数(2)、jieba分词的原理Jieba分词依靠中文词库-利用一个中文词库,确定汉字之间的关联概率-汉字间概率大的组成词组,形成分词结果-除了分词,用户还可以添加自定义…

    2022年5月24日
    40
  • 怎么查询自己的网站是否被挂马_被墙域名检测

    怎么查询自己的网站是否被挂马_被墙域名检测在我们日常seo优化工作当中,会经常碰到网站被挂马了,原因是我们很多都是用的常用的cms网站系统,如织梦、帝国等,这种网站程序都是开源的代码,所以就会有些漏洞,导致很多所谓刚入门的学习的所谓黑客们进行攻击,利用各种挂马检查工具进行攻击,导致我们的网站网页中有其他乱七八糟的页面,严重的首页打不开,后台没有权限打开等。那么接下来就为广大seo优化人员讲解一下,如果你网站被挂马了,如何检查出来,然后又如何进行防止被挂马,进行相应的措施,加强网站的安全维护。一**、那么,网站挂马检测工具有哪些呢?**1、第一种

    2022年9月30日
    1
  • evaluateJavascript_jquery form

    evaluateJavascript_jquery formhttp://www.position-relative.net/creation/formValidator/demos/demoValidators.html      $(function(){      $(“#enrolment_Form”).validationEngine(“attach”);      va

    2022年10月3日
    0
  • 自学编程的妙方法,直接省了几万块钱报班,不收藏就可惜了!

    自学编程的妙方法,直接省了几万块钱报班,不收藏就可惜了!答应我,别再做无用功了,好方法都在这里了!

    2022年6月17日
    23
  • spring-boot-start 找pom配置链接地址

    spring-boot-start 找pom配置链接地址spring-boot-start 找pom配置链接地址

    2022年4月24日
    64

发表回复

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

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