简单工厂模式

简单工厂模式(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值