大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
PHP设计模式-工厂模式
一、工厂模式概念
工厂模式,顾名思义,像工厂的流水线,固定的规格,固定的材料,做固定的事情。
工厂模式分为三种:简单工厂、工厂方法、抽象工厂 ,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是非常稳定的。
二、示例:
我这里用了一个上报埋点数据的类简单做个例子
1、工厂的标准
//神测上报的标准,在抽象类中定义
abstract class BaseBuriedPoint {
/**
* 埋点事件名
*/
abstract protected function getEvent(): EventEnum;
/**
* 事件相关用户id
*/
abstract protected function getDistinctId(): string;
public function report(): void {
//上报
}
}
2、继承或实现抽象类 按照标准实现功能
/**
* 首页埋点
*/
class IndexView extends BaseBuriedPoint{
/**
* @var string
*/
protected $distinctId;
/**
* @var IndexPageEnum
*/
protected $pageEnum;
public function __construct(string $distinctId,IndexPageEnum $pageEnum) {
$this->distinctId = $distinctId;
$this->pageEnum = $pageEnum;
}
protected function getEvent(): EventEnum {
return EventEnum::INDEX_PAGE();
}
protected function getDistinctId(): string {
return $this->distinctId;
}
protected function getProperties(): array {
return [
'page_id' => $this->pageEnum->getValue(),
'page_name' => $this->pageEnum->name,
];
}
}
/**
* 登陆埋点
*/
class Login extends BaseBuriedPoint{
//
}
3、简单工厂
class ShenCe { //对比抽象工厂:抽象工厂模式可以生产不同的产品线 。把类抽象化interface 由不同的子类实现不同的产品线
// 简单工厂里的静态方法
static function Index() { //对比工厂模式:方法接口化interface
return new IndexView();
}
static function Login() {
return new Login();
}
//...
}
三、概念理解:
简单工厂调用 不需要管功能是那个类实现的 直接调用工厂里的方法,或者以传参形式调用
工厂方法比较简单工厂就是把简单工厂里的方法接口化
抽象工厂可以生产不同的产品线
工厂模式使用interface或者abstract都可以实现
四、扩展知识点:抽象类和接口的异同
1. 相同点:
(1)两者都是抽象类,都不能实例化。
(2) interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。
2.不同点:
(1)interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends 。
(2)一个类可以实现多个 interface ,但一个类只能继承一个 abstract class 。
(3)interface 强调特定功能的实现,而 abstract class 强调所属关系。
(4)interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。
(5) abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstract class 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。
(6)接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。
(7)接口中的抽象方法只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。
五、总结:
工厂模式体现了PHP的三大特性 封装,继承,多态。通过工厂模式的开发,能够较大程度的降低代码间的耦合度,提高代码的可扩展性。但是也会存在相应的缺点,比如在需要在工厂抽象层基类中增加需要实现的抽象方法,就需要修改实现功能的所有的子类。所以设计抽象层非常重要。是否使用工厂模式或者抽象类需要结合实际情况灵活使用
版权声明:不支持转载
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164359.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...