PHP设计模式之工厂方法模式

202 阅读4分钟

前言

最近在开始学习设计模式,以前虽然也学习过,是那种学了就忘,一写就废的状态,这会结合代码来实操一下,看看效果怎么样,不然学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这条生产流水线的产品质量就可以了

总结

工厂方法模式退化后可以演变为简单工厂模式,升级可以称为抽象工厂模式,后面我会来介绍这两种模式,通过它们对比来看,那种模式更好