php简单工厂模式

简单工厂模式

工厂模式的意义:

在开发中,经常存在客户端和服务端分离开发的情况,也就是说服务端负责提供底层的一些借口,客户端这边直接调用,客户端不需要关心服务端是怎么实现的,也不需要看到服务端的代码(php是可以看到的,因为可以直接跟踪源码,而像java这边服务端是直接编译过的包,源码是无法看到的),鉴于此种情况,我们就引入了工厂模式

php简单工厂模式

 

工厂模式图解 

OperationFactory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法 createOperate(),它的返回类型为具体产品角色。


Operation(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。


OperateAdd、OperateSub、OperateMul、OperateDiv(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

//抽象产品

abstract class Operation{

    private $_a;

    private $_b;

    public function __set($name,$value){

        $this->$name = $value;

    }

    public function __get($name){

        return $this->$name;

    }

    abstract function getResult();

}

//具体产品(1)

class OperateAdd extends Operation{

    public function getResult(){

        return $this->_a + $this->_b;

    }

}

//具体产品(2)

class OperateSub extends Operation{

    public function getResult(){

        return $this->_a - $this->_b;

    }

}

//具体产品(3)

class OperateMul extends Operation{

    public function getResult(){

        return $this->_a * $this->_b;

    }

}

//具体产品(4)

class OperateDiv extends Operation{

    public function getResult(){

        if($this->_b == 0){

            throw new Exception('除数不能为0');

        }

        return $this->_a / $this->_b;

    }

}

工厂角色

class OperationFactory{

    public static function createOperate($operate){

        switch ($operate){

            case '+':

                $oper = new OperateAdd();

                break;

            case '-':

                $oper = new OperateSub();

                break;

            case '*':

                $oper = new OperateMul();

                break;

            case '/':

                $oper = new OperateDiv();

                break;

        }

        return $oper;


    }

}

//对于客户端来说 只需要开放工厂方法  和抽象类就可以实现功能

$oper = OperationFactory::createOperate('-');

$oper->_a = 1;

$oper->_b = 10;

$res = $oper->getResult();

var_dump($res);

上一篇:SP9934 ALICE - Alice and Bob


下一篇:springboot中使用aop记录操作和异常日志