工厂模式

简单工厂模式
<?php
//简单工厂模式
/*接口*/
interface db{
    function conn();
}

class dbmysql implements db{
    public function conn(){
        echo '连接上了mysql';
    }
}

class dboracle implements db{
    public function conn(){
        echo '连接上了oracle';
    }
}
/*开放一个工厂方法,不能让人直接new,只能通过工厂中的createDB来获得对象*/
class Factory{
    public static function createDB($type){
        if($type == 'mysql')
            return new dbmysql();
        elseif($type == 'oracle')
            return new dboracle();
        else
            return 'error';
    }
}

/*客户端,并不知道有哪些数据库类,只知道工厂方法,调用工厂方法createDB*/
$mysql = Factory::createDB('mysql');
$mysql->conn();

$oracle = Factory::createDB('oracle');
$mysql->conn();

/*弊端:对于扩展并不理想,比如想要添加mongodb的数据类,那么服务端需要修改factory方法,如果是php脚本还好,但是如果是java,c++则需要重新编译,这是面向对象设计的重要法则,开闭原则:对于修改是封闭的,对于扩展是开放的*/

工厂模式

<?php
//工厂模式
/*接口,新添加了一个工厂接口*/
interface db{
    function conn();
}

interface factory{
    function createDB();
}

class dbmysql implements db{
    public function conn(){
        echo '连接上了mysql';
    }
}

class dboracle implements db{
    public function conn(){
        echo '连接上了oracle';
    }
}

class mysqlFactory implements factory{
    public function createDB(){
        return new dbmysql();
    }
}

class oracleFactory implements factory{
    public function createDB(){
        return new dboracle();
    }
}

/*服务端添加一个mongodb数据类,只需要包含一个类文件就可以了,不需要修改之前简单工厂中的factory类*/
class dbmongodb implements db{
    public function conn(){
        echo '连接上mongodb';
    }
}

class mongodbFactory implements factory{
    public function createDB(){
        return new dbmongodb();
    }
}

//客户端调用
$factory = new mongodbFactory();
$mongodb = $factory->createDB();
$mongodb->conn();
在接口应用的时候,可以用工厂模式,因为总是有许多的判断,if。。。elseif。。。else这样的,比如判断返回接口数据类型是json,xml等,比如判断接口aciton函数动作是什么。可以用到开闭原则,优雅的省略了if,else判断,便于扩展,避免了修改原先的代码。但是这里的

$this->AnalysisData->$act();
不过总有些忐忑,不知道这样参数形式调用类里面的方法对不对?

<?php
class httpUnit{
    protected $AnalysisData = null;

    public function setAnalysisData($AnalysisData){
        $this->AnalysisData = new $AnalysisData;
    }

    public function analysis($type){
        $AnalysisData = $this->AnalysisData;
        $AnalysisData->analysis($type);
    }

    public function action($act){
        $this->AnalysisData->$act();
    }
}
/*解析数据接口,扩展的时候只要添加,XXXAnalysisDate类就可以了*/
interface AnalysisData{
    public function analysis($type);
}
class JsonAnalysisDate implements AnalysisData{
    public function analysis($type) {
        echo $type;
    }

    public function action(){
        echo "\n\r action";
    }
}
class XmlAnalysisDate implements AnalysisData{
    public function analysis($type) {
        echo $type;
    }
}

$http = new httpUnit();
$http->setAnalysisData('JsonAnalysisDate');
$http->analysis('json');
$http->action('action');


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值