大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
定义:我们只需要提供一个创建对象实例的功能,而无需关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。
一、简单工厂模式(平时开发中基本上简单工厂模式就够用了)
说明:
-
Api: 定义客户所需要的功能接口(后面具体实现的类基本上就根据这个来)
-
Impl: 具体实现Api的实现类,一般有多个,
-
Factory: 工厂,选择合适的实现类来创建Api接口对象(对外暴露)
-
Client: 客户端,通过Factory 来获取Api接口对象,然后面向Api接口编程
工厂方法命名规则建议:
-
对外开放的类命名建议为“模块名称+Factory”,比如,用户模块的工厂就称为UserFactory
-
方法名称通常为“get+接口名称”或者是“create+接口名称”。比如用户接口名称为UserEbi,那么方法名称通常为getUserEbi或者createUserEbi。
简单工厂方法的内部主要实现的功能是“选择合适的实现类”,选择条件或者是参数的来源通常为一下集中:
-
来源于客户端,由Client来传入参数
-
来源于配置文件,从配置文件获取用于判断的值
-
来源于程序运行期的某个值,比如从缓存中获取某个运行期的值
简单工厂的优缺点:
优:使用户不用关心具体类的实现以及调用。
缺:未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。
二、普通工厂模式:
优缺点:
优点:当有新的产品需要加进来时不需要新增改变底层当类,可以直接继承接口,外部实现就可以了;
缺点:外观上看起来比简单工厂复杂。
三、抽象工厂模式:
特点:抽象工厂模式围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
应用实例:在之前的例子中一次调用只会涉及到一个工厂,但是有些复杂的场景必须要几个工厂一起协作的,比如我们吃饭,需要基本的碗和筷子,碗和筷子本身是两个工厂类,但是在吃饭上关联在一起了,这时候我们在调用碗的时候同时也必须使用筷子,
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 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);
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164355.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...