普通初學者喜歡的寫法
例子:實現一個簡單計算器
class Program
{
public $symbol;
public $num1;
public $num2;
public function __construct($symbol, $num1, $num2)
{
$this->symbol = $symbol;
$this->num1 = $num1;
$this->num2 = $num2;
}
public function calculate()
{
switch ($this->symbol) {
case '+':
$result = $this->num1 + $this->num2;
break;
case '-':
$result = $this->num1 - $this->num2;
break;
case '*':
$result = $this->num1 * $this->num2;
break;
case '/':
if ($this->num2 != 0) {
$result = $this->num1 / $this->num2;
} else {
$result = "除數不能為0";
}
break;
default:
$result = "運算子錯誤";
}
return $result;
}
}
$program = new Program('+', 1, 14);
$result = $program->calculate();
print_r($result);//15
在上面的程式碼中存在的缺點:
緊耦合,不易擴充套件,如果新增了一個平方根運算,卻需要讓加減乘除都來參與編譯,如果一不小心把加法運算改成了減法,那就麻煩了。
使用簡單工廠模式重新實現達到解耦的目的
將加減乘除解耦,每一個運算用單獨的類去寫,再用工廠模式例項化出合適的物件,透過多型返回計算器結果,後面如果再加一個平方根運算可以新增一個平方根的類,如果需要修改加法運算,那就只需要修改OperationAdd類。
class Operation
{
public $num1;
public $num2;
}
class OperationAdd extends Operation
{
public function getResult()
{
$result = $this->num1 + $this->num2;
return $result;
}
}
class OperationSub extends Operation
{
public function getResult()
{
$result = $this->num1 - $this->num2;
return $result;
}
}
class OperationMul extends Operation
{
public function getResult()
{
$result = $this->num1 * $this->num2;
return $result;
}
}
class OperationDiv extends Operation
{
public function getResult()
{
if ($this->num2 != 0) {
$result = $this->num1 / $this->num2;
} else {
$result = "除數不能為0";
}
return $result;
}
}
class OperationFactory
{
public static function createOperate($symbol)
{
switch ($symbol) {//多型
case '+':
$result = new OperationAdd();
break;
case '-':
$result = new OperationSub();
break;
case '*':
$result = new OperationMul();
break;
case '/':
$result = new OperationDiv();
break;
default:
$result = NULL;
}
return $result;
}
}
$operationFactory = OperationFactory::createOperate('+');
$operationFactory->num1 = 21;
$operationFactory->num2 = 11;
echo $operationFactory->getResult();//32
本作品採用《CC 協議》,轉載必須註明作者和本文連結