PHP设计模式-工厂模式

原创 2017年01月03日 19:46:38

概念

工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤。
很多高级模式都是依赖于工厂模式。

好处

PHP中能够创建基于变量内容的类的新实例,减少主代码流中的基于条件复杂性;
同时如果类发生改变不需要所有的地方进行修改,只需要在工厂中进行修改
(无论对象被修改或者添加其他对象,Factory对象调用方式仍让是相同的)(集中实例化)

应用场景

做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。
方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来,
做成接口形式,让所有的子类都要实现它的接口。
以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。

在为用户注册的时候,分为很多种角色的用户。
比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,
代码也容易维护,为每种角色可以生成操作的类等等。

系统对接多个不同类型的数据库,mysql,oracle,sqlserver

示例代码

简单工厂模式Factory,提供一个工厂方法供客户端调用。可能违反开闭原则。
<?php

/**
 *@class 服务端开发(不知道谁将会被调用)
 *
 */
class dbmysql{
    public function conn() {
        echo '连接上了Mysql';
    }
}
class dbsqlite{
    public function conn() {
        echo '连接上了sqlite';
    }
}

/**
 *@class 简单工厂,工厂方法
 *
 */
class Factory{
    public static function  createDb($type = '') {
        if($type == 'mysql') {
            return new dbmysql();
        }elseif($type == 'sqlite') {
            return new dbsqlite();
        }else{//报错
            throw new Exception("Error db type", 1);
        }
    }
}

/**
 *@class 客户端看不到dbmysql dbsqlite内部细节的,只是知道接口
 */
//只知道服务端开放了一个Factory::createDb()方法
//方法只允许传递数据库名称,如果新增一个oracle需要修改Factory(比较麻烦)
//面向对象设计法则中,重要的开闭原则--对于修改是封闭的,对于扩展是开放的。
$db = Factory::createDb('mysql');
$db = Factory::createDb('sqlite');
$db->conn();
工厂方法:一个工厂生产多个零件,但零件共同特点是属于一个产品。
此工厂可以生产产品,而非单独的对象。
<?php
//共同接口
interface db{
    public function conn();
}
/**
 *@class 服务端开发(不知道谁将会被调用)
 *
 */
class dbmysql implements db{
    public function conn() {
        echo '连接上了Mysql';
    }
}
class dbsqlite implements db{
    public function conn() {
        echo '连接上了sqlite';
    }
}

/**
 *@定义一个工厂接口 
 */
interface Factory{
    public function createDB();
}
/**
 *@实现这个接口 
 */
class mysqlFactory implements Factory{
    public function createDB() {
        return new dbmysql();
    }
}
class sqliteFactory implements Factory{
    public function createDB() {
        return new dbsqlite();
    }
}
/**
 *@新增一个oracle 
 */
class oracleFactory implements Factory{
    public function createDB() {
        return new oracle();
    }
}
class oracleDb implements db{
    public function conn() {
        echo '连接上了oracle';
    }
}

//客户端调用
$fact = new mysqlFactory();//使用一个mysql工厂造一个mysql连接
$db = $fact->createDB();
$db->conn();
$fact = new sqliteFactory();
$db = $fact->createDB();
$db->conn();
$fact = new oracleFactory();
$db = $fact->createDB();
$db->conn();
示例三:通过常茹不同参数
class CDFactory{
        public static function create($type)
        {
            $class = strtolower($type) . "CD";
            return new $class;
        }
    }
    //通过传入不同的参数来实例化不同的对象;统一在工厂类中进行实例化
    $type = 'enhanced';$cd = CDFactory::create($type);
    $type = '';$my_cd = CDFactory::create($type);
示例四:通过传入不同参数,动态实例化不同的类。
//通过传入不同的参数,来获取不同的数据库对象信息;
    public function factory($db_config='') {
        // 读取数据库配置
        $db_config = $this->parseConfig($db_config);
        if(empty($db_config['dbms']))
            throw_exception(L('_NO_DB_CONFIG_'));
        // 数据库类型
        $this->dbType = ucwords(strtolower($db_config['dbms']));
        $class = 'Db'. $this->dbType;
        if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
            // 内置驱动
            $path = CORE_PATH;
        }else{ // 扩展驱动
            $path = EXTEND_PATH;
        }
        // 检查驱动类
        if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
            $db = new $class($db_config);//工厂模式的核心语句
            // 获取当前的数据库类型
            if( 'pdo' != strtolower($db_config['dbms']) )
                $db->dbType = strtoupper($this->dbType);
            else
                $db->dbType = $this->_getDsnType($db_config['dsn']);
            if(APP_DEBUG)  $db->debug    = true;
        }else {
            // 类没有定义
            throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);
        }
        return $db;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

PHP设计模式之——工厂模式

在开发大型系统过程中,往往会出现这样一种情况: 我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去...
  • mysteryhaohao
  • mysteryhaohao
  • 2016年04月18日 17:11
  • 3689

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较 PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所...
  • u010412301
  • u010412301
  • 2017年02月08日 12:06
  • 2234

简单工厂模式之php实现

简单工厂模式又叫静态工厂方法模式,主要作用是通过一个简单工厂类来实例化(创建)各个类的对象,而不需要通过new来实例化对象。优点在于,工厂类中包含了一定的逻辑判断,会根据客户端的选择条件动态实例化相关...
  • weichaolei2
  • weichaolei2
  • 2016年04月06日 16:35
  • 474

API开发第二篇:PHP的设计模式之工厂模式

设计模式是个好动西,今天先简单说说工厂模式的作用,后续会把这次API开发中使用的东西一点点写出来。算是一次总结吧。...
  • hel12he
  • hel12he
  • 2015年02月05日 23:15
  • 1545

php实现抽象工厂模式

设计模式-使用php实现抽象工厂模式 【概要】 创建型模式 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类【GOF95】 【特点】 抽象工厂模式(Abst...
  • zhaoxuejie
  • zhaoxuejie
  • 2011年12月20日 14:22
  • 5279

设计模式之PHP项目应用——简单工厂模式设计计算器

1 简单工厂模式简介     简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 2 模式组成 1)工厂(Creator)角色 ...
  • CleverCode
  • CleverCode
  • 2015年05月13日 14:41
  • 3032

php实现工厂模式

设计模式-使用php实现工厂方法模式 【概要】 创建型模式 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】 ...
  • zhaoxuejie
  • zhaoxuejie
  • 2011年12月15日 09:53
  • 11966

PHP设计模式系列(四):工厂方法模式

工厂方法模式工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory...
  • qq_32300363
  • qq_32300363
  • 2017年04月29日 14:42
  • 481

3. php的设计模式:从支付开始谈工厂模式

单纯的讲设计模式非常的没有意思,而且不利于理解与实践使用。我通过将工厂模式与开发中集成支付的场景进行结合讲解,相信大家能够很好的后面工作中实践工厂模式。...
  • hel12he
  • hel12he
  • 2016年06月18日 02:05
  • 986

php简单工厂模式

简单工厂模式(Simple Factory Pattern): 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类...
  • bk_guo
  • bk_guo
  • 2017年06月28日 16:15
  • 1948
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP设计模式-工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)