mysql工厂模式_php设计模式:工厂模式

标签:

概念

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

很多高级模式都是依赖于工厂模式。

好处

PHP中能够创建基于变量内容的类的新实例,减少主代码流中的基于条件复杂性;

同时如果类发生改变不需要所有的地方进行修改,只需要在工厂中进行修改

(无论对象被修改或者添加其他对象,Factory对象调用方式仍让是相同的)(集中实例化)

应用场景

做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。

方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来,

做成接口形式,让所有的子类都要实现它的接口。

以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。

在为用户注册的时候,分为很多种角色的用户。

比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,

代码也容易维护,为每种角色可以生成操作的类等等。

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

示例代码

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

1

/**

*@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();

工厂方法:一个工厂生产多个零件,但零件共同特点是属于一个产品。

此工厂可以生产产品,而非单独的对象。

1

2

//共同接口

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();

示例三:通过常茹不同参数

1

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);

示例四:通过传入不同参数,动态实例化不同的类。

1

//通过传入不同的参数,来获取不同的数据库对象信息;

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;

}

原文:https://blog.csdn.net/gurenshen/article/details/53997373

版权声明:本文为博主原创文章,转载请附上博文链接!

标签:

来源: https://blog.csdn.net/lifei191042/article/details/83302525

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值