您的位置:首页 > 编程语言 > PHP开发

php工厂模式

2019-03-02 20:44 92 查看

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

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

说明:

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

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

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

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

工厂方法命名规则建议:

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

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

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

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

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

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

简单工厂的优缺点:

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

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

二、普通工厂模式:

优缺点:

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

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

三、抽象工厂模式:

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

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

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

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

实例:

AbstractFactory.php

[code]<?php

namespace DesignPatterns\Creational\AbstractFactory;

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

JsonFactory.php

[code]<?php

namespace DesignPatterns\Creational\AbstractFactory;

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

HtmlFactory.php

[code]<?php

namespace DesignPatterns\Creational\AbstractFactory;

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

Text.php

[code]<?php

namespace DesignPatterns\Creational\AbstractFactory;

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

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

JsonText.php

[code]<?php

namespace DesignPatterns\Creational\AbstractFactory;

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

HtmlText.php

[code]<?php

namespace DesignPatterns\Creational\AbstractFactory;

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

1.1.4. Test

Tests/AbstractFactoryTest.php

[code]
<?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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: