简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
UML图
简单工厂模式中包含的角色及其相应的职责如下:
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
具体的产品继承自抽象产品,然后由简单工厂类进行实例化。具有较好的可维护性和扩展性。
如果我们需要修改某个产品时,只需要修改对应的产品类,并不会影响其他的产品类。我们新增一个产品的时候也很方便,只需要新建一个产品类,然后再工厂模式的switch语句添加判断就行了。
简单工厂模式的概念并不难理解,只是自己用的还不多,日后慢慢体会吧。
下面是《大话设计模式》里面的例子—设计一个加减乘除的程序,做了简单修改。
首先是我们的抽象产品类Base
Base.php
<?php
abstract class Base
{
public $numA;
public $numB;
public $res;
function getResult(){
return $this->res;
}
function setParm($numA,$numB){
$this->numA = $numA;
$this->numB = $numB;
}
abstract function calculate();
}
然后是四个具体产品类Add、Subtract、Multiply、Divide
Add.php
<?php
class Add extends Base
{
function calculate(){
$this->res = $this->numA + $this->numB;
}
}
Subtract.php
<?php
class Subtract extends Base
{
function calculate(){
$this->res = $this->numA - $this->numB;
}
}
Multiply.php
<?php
class Multiply extends Base
{
function calculate(){
$this->res = $this->numA * $this->numB;
}
}
Divide.php
<?php
class Divide extends Base
{
function calculate(){
if($this->numB==0){
$this->res = "error";
}else{
$this->res = $this->numA / $this->numB;
}
}
}
接下来是我们的工厂类Factory.php
<?php
require_once "./fun/Base.php";
class Factory
{
static function createOperate($symbol){
$operater = null;
switch ($symbol) {
case '+':
$operater = new Add();
break;
case '-':
$operater = new Subtract();
break;
case '*':
$operater = new Multiply();
break;
case '/':
$operater = new Divide();
break;
}
return $operater;
}
}
//自动加载所需类
spl_autoload_register(function($class){
require_once "./fun/".$class.".php";
});
最后是调用相关类的index.php
<?php
require_once "Factory.php";
$oper = Factory::createOperate("+");
$oper->setParm(2,3);
$oper->calculate();
$res = $oper->getResult();
echo $res;