[php] 设计模式之 工厂模式

<?php
//利用简单的工作类实现 计算器 加减乘除

//虚基类
abstract class Operator{
	//设为保护 除法的时候需要访问
	protected $NumA;
	protected $NumB;
	//构造函数
	public function __construct($parmasFirst, $parmasSecond){
		$this->NumA = $parmasFirst;
		$this->NumB = $parmasSecond;
	}
	//虚函数 
	abstract function getResult();
}
//加法类
class OperatorAdd extends Operator{
	//构造函数
	public function __construct($parmasFirst, $parmasSecond){
		parent::__construct($parmasFirst, $parmasSecond);
	}
	//析构函数
	public function __destruct(){

	}
	//操作
	public function getResult(){
		return $this->NumA  + $this->NumB;
	}
}
//减法
class OperatorSub extends Operator{
	//构造函数
	public function __construct($parmasFirst, $parmasSecond){
		parent::__construct($parmasFirst, $parmasSecond);
	}
	//析构函数
	public function __destruct(){

	}
	//操作
	public function getResult(){
		return $this->NumA  - $this->NumB;
	}	
}
//乘法
class OperatorMul extends Operator{
	//构造函数
	public function __construct($parmasFirst, $parmasSecond){
		parent::__construct($parmasFirst, $parmasSecond);
	}
	//析构函数
	public function __destruct(){

	}
	//操作的方法
	public function getResult(){
		return $this->NumA  * $this->NumB;
	}
}
//除法
class OperatorDiv extends Operator{
	//构造函数
	public function __construct($parmasFirst, $parmasSecond){
		parent::__construct($parmasFirst, $parmasSecond);
	}
	//析构函数
	public function __destruct(){

	}
	//操作的方法
	public function getResult(){
		if ($this->NumB == 0) {
			throw new Exception("被除数不能为0", 1);
			return 0;
		}
		return $this->NumA  / $this->NumB;
	}
}


//工厂类
class OperatorFactory{
	//用于符号和类的转换
	public $operatorTag = array(
        '*' => 'mul',
        '/' => 'div',
        '-' => 'sub',
        '+' => 'add'
    );
	//构造函数
	public function __construct(){

	}
	//析构函数
	public function __destruct(){

	}
	public function create($NumA, $NumB, $tag){
		try{
			//判断是否有此操作符
			$tag = strtolower($tag); //转为小写
			if(!array_key_exists($tag , $this->operatorTag)) {
           		 throw new Exception('no operator tag');
           		 return;
       		}
       		//获取操作类名称
       		$operatorName = $this->operatorTag[$tag];
       		$operatorClassName = 'operator'.ucfirst($operatorName);
			//操作类是否存在
			if(!class_exists($operatorClassName)) {
            	throw new Exception('no operator class');
            	return;
       		}
       		//创建类并执行操作
			$operationObj = new $operatorClassName( $NumA, $NumB);
			$result = $operationObj->getResult();
			$operationObj = null;
			return $result;
		}catch(Exception $e){
			$msg = $e->getmessage();
			die($msg);
			return 0;
		}
	}
}

//这边进行测试
$test = new OperatorFactory();
echo $test->create( 3, 1, '+');

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值