简单工厂模式

2023-07-16

简单工厂模式定义

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现

简单工厂的 UML 图

简单工厂模式中的各个角色以及相应职责:

  1. 简单工厂: 简单工厂模式的核心,由它负责创建所有的所有类的内部逻辑.即通过调用简单工厂的类方法并传递参数,然后由简单工厂创建对应的类
  2. 抽象产品: 简单工厂模式所创建的所有对象的父类,这里父类不一定非要接口,也可以使抽象类,它负责描述所有实例所共有的公共接口
  3. 具体产品:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类

具体实例

public interface Operation{
    /*
    * 获取结果
    */
    public function get();
}

/*
*  加法类
*/
class OperationAdd implements Operation{
    private $_NumA;
    private $_NumB;
    
    public function __construct($num1,$num2) {
        $this->_NumA = $num1;
        $this->_NumB = $num2;
    }
    
    public function get() {
        return ($this->_NumA + $this->_NumB);
    }
}

class OperationSub implments Operation {
    private $_NumA;
    private $_NumB;
    
    public function __construct($num1,$num2) {
        $this->_NumA = $num1;
        $this->_NumB = $num2;
    }
    
    public function get() {
        return ($this->_NumA - $this->_NumB);
    }    
    
}

public class OperaFactory{
    
    private $_results;
    private $_opera;
    
    public function __construct() {
        $this->_results = 0;
    }
    
    public function Calculate($num1,$num2,$operator) {
        swtich($operator) {
            case '+':
                $this->_opera = new OperationAdd($num1,$num2);
                break;
            case '-':
                $this->_opera = new OperationSub($num1,$num2);
                break;
            default:
                break;
        }
        $this->_results = $this->_opera->get();
        return $this->_results;
    }   
}

优缺点

在讲述优缺点的之前,我们可以先思考一个问题,就当前的例子而言,如果我们需要添加一个 乘法的类,我们只需要定义一个类方法继承Operation这个接口,然后实现该方法,最后在OperaFactory中的Calculate中加一个新的分支
优点:
从上述例子以及简单的思考,不难看出通过简单工厂设计模式使得程序变得更加灵活,便于修改,并易于复用,降低了代码的耦合性
缺点:
如我们在代码所见那样,所有的创建逻辑都在OperaFactory中的Calculate,一旦其不能正常工作,整个系统都将收到影响