简介: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
优缺点:
优点:工厂处理好逻辑后,外部可直接调用,不用一一调用各自的逻辑类,优化代码结构
缺点:违反高内聚责任分配原则
实现条件:
1.工厂条件:处理逻辑
2.产品角色:interface 或者 abstract 产品父类,描述所有产品接口
3.产品具体角色:实现 interface 或者继承 abstract 的具体产品类,具体产品类;
代码(代码仿照白俊瑶博客写的,完全为了加深印象):
1.普通的例子
Bad.php
<?php
namespace factory;
class Bad{
public function getResult($numA,$operation,$numB){
switch($operation){
case '+':
$result = $numA+$numB;
break;
case '-':
$result = $numA-$numB;
break;
case '/':
if($numB !=0){
$result = $numA/$numB;
}else{
throw new \InvalidArgumentException('除数不能为0');
}
break;
case '*':
$result = $numA*$numB;
break;
default:
throw new \InvalidArgumentException('除数不能为0');
}
return $result;
}
index.php
<?php
require __DIR__.'/../Loader.php';
spl_autoload_register('Loader::autoload');//注册自动加载
$program = new \factory\Bad();
$result = $program->getResult(1,'+',2);
echo $result;
2.把各个运算单独封装类
Operation.php
<?php
namespace factory;
abstract class Operation{
protected $numA=0;
protected $numB=0;
abstract public function getResult();
public function setNumberA($number){
$this->numA = $number;
}
public function setNumberB($number){
$this->numB = $number;
}
}
Sub.php减法类
<?php
namespace factory;
abstract class Operation{
protected $numA=0;
protected $numB=0;
abstract public function getResult();
public function setNumberA($number){
$this->numA = $number;
}
public function setNumberB($number){
$this->numB = $number;
}
}
index.php
<?php
require __DIR__.'/../Loader.php';
spl_autoload_register('Loader::autoload');//注册自动加载
$program = new \factory\Sub();
$program->setNumberA(5);
$program->setNumberB(2);
$result = $program->getResult();
echo $result;
3.简单工厂模式
Factory.php
<?php
namespace factory;
class Factory
{
public function create($operation){
switch($operation){
case '+':
return new Add();
break;
case '-':
return new Div();
break;
case '*':
return new Mul();
break;
case '/':
return new Div();
break;
default:
throw new \InvalidArgumentException('不支持的运算');
break;
}
}
}
index.php
<?php
require __DIR__.'/../Loader.php';
spl_autoload_register('Loader::autoload');//注册自动加载
$program = new \factory\Factory();
$operation = $program->create('+');
$operation->setNumberA(5);
$operation->setNumberB(3);
$result = $operation->getResult();
echo $result;