前言
最近在开始学习设计模式,以前虽然也学习过,是那种学了就忘,一写就废的状态,这会结合代码来实操一下,看看效果怎么样,不然学Laravel有点够呛
工厂模式
本篇文章主要是学习了解工厂方法模式,在学习工厂方法模式就不得不了解简单工厂模式、抽象工厂模式,这两种模式我会用两篇文章来做介绍, 这里受篇幅的影响就只谈工厂模式。直接说理论有点枯燥,我也看不懂,用工厂方法模式设计出一个简单的计算器,要好用又好看(🤭)
<?php
// 操作抽象类
abstract class Operation
{
protected $a;
protected $b;
public function setA($a)
{
$this->a = $a;
}
public function setB($b)
{
$this->b = $b;
}
abstract public function getResult();
}
// 加法操作类
class OperationAdd extends Operation
{
public function getResult()
{
return $this->a + $this->b;
}
}
// 减法操作类
class OperationMul extends Operation
{
public function getResult()
{
return $this->a - $this->b;
}
}
// 乘法操作类
class OperationSub extends Operation
{
public function getResult()
{
return $this->a * $this->b;
}
}
// 除法操作类
class OperationDiv extends Operation
{
public function getResult()
{
return $this->a / $this->b;
}
}
// 工厂接口
interface IFactory
{
public function createOperation();
}
// 加法工厂类
class AddFactory implements IFactory
{
public function createOperation()
{
return new OperationAdd();
}
}
// 减法工厂类
class MulFactory implements IFactory
{
public function createOperation()
{
return new OperationMul();
}
}
// 乘法工厂类
class SubFactory implements IFactory
{
public function createOperation()
{
return new OperationSub();
}
}
// 除法工厂类
class DivFactory implements IFactory
{
public function createOperation()
{
return new OperationDiv();
}
}
// 使用加法工厂类加工生成加法操作对象
$factory = new AddFactory();
$operation=$factory->createOperation();
// 设置A、B数
$operation->setA(1);
$operation->setB(100);
// 运算
echo $operation->getResult();
哇,你这计数器好复杂,为了实现加法,首先你得实例化加法工厂类,然后再通过加法工厂得到加法操作对象,最后得到加法结果,太难了,我用$a+$b
就得到结果了啊。
确实是这样子的,这是工厂方法模式特性,为了实例化操作类,对每种操作都建立一个对应的工厂类,比如这里我们新加入取模运算,就需要增加OperationDem取模操作类和DemFactory取模工厂。
工厂方法模式的优点
可以看出当系统需要新增功能的时候,需要添加一个具体的操作类,然后再添加一个对应的工厂类,对之前已经实现的操作没有影响,也不需要客户端修改什么,自己拿来用就可以,很好的符合了“开发-封闭”原则。
工厂方法模式的缺点
缺点就是操作比较复杂,需要先实例化操作工厂类,通过工厂来实例化操作类,每种操作的工厂类是不一样的,如果要实现一个加减乘除的运算,那么客户端的需要实例化很多的类,效率是可想而知的
怎么理解工厂方法模式
通过上面的介绍,好像也没有get到这种模式设计底解决了什么问题,这是学习模式的一个痛点,既然知道,那么尝试记住这种模式的特点,以后遇到了在脑海里有点印象。
这种模式核心工厂类不再负责所有产品的创建,转而把责任交给负责创建产品的子类去做,这个工厂类仅仅给出具体工厂必须实现的接口,而实例化产品这种具体的工作完全由子类去完成。
这里打一个不太确切的比方,苹果公司的所有产品组装生产工作都由富士康来完成,富士康这个工厂类不负责具体产品的生产工作,具体负责生成工作的由具体的产品流水线来负责,而富士康只需确定产品生产规范,具体生产细节由流水线去完成。如果苹果公司开发了一款新产品,只需要把新产品交给富士康就可以了,新产品的具体组装生产工作由新流水线来完成,其他产品流水线不受影响。像出现Iphone屏幕容易被折弯的问题,只需要加强Iphone这条生产流水线的产品质量就可以了
总结
工厂方法模式退化后可以演变为简单工厂模式,升级可以称为抽象工厂模式,后面我会来介绍这两种模式,通过它们对比来看,那种模式更好