<?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, '+');
[php] 设计模式之 工厂模式
猜你喜欢
转载自blog.csdn.net/qq635968970/article/details/83217340
今日推荐
周排行