一.接口继承直接调用

先看看这样一段代码:

 <?php

  interface db{
function conn();
} class dbmysql implements db {
public function conn(){
echo "连接到了mysql";
}
} class dbsqlite implements db{
public function conn(){
echo "连接到了sqlite";
}
} ?>

在客户端调用mysql连接时,我们用了如下代码

 $db=new dbmysql();
$db->conn();

最后的显示结果为: 连接到了mysql

优点:直接调用,简单明了

缺点:在这个过程中,客户端很清楚的知道我们服务器端的两个数据库连接类,所以不够安全。而我们要做的就是不让用户知道我们有这么两个类,只让他们知道我们连接了那个数据库。

所以,就要用到下面的模式。即

二、简单工厂模式

其代码如下:

class Factory{
public static function createDB($type){
if($type=='mysql'){
return new dbmysql();
}else if($type=='sqlite'){
return new dbsqlite();
}else{
throw new Exception("Error db type ",1);
}
}
}

这样我们就可以直接使用工厂来调用。其代码如下

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

输出结果为: 连接到了mysql

优点:客户端应该只看到接口,不知道接口的实现. 体现封装隔离原则.

缺点:如果新增加了PDO方式,则要又要修改Factory类,违反了开闭原则。即软件实体应当对扩展开放,对修改关闭。

三、工厂模式

工厂方法中,一个工厂生产多个零件,但零件的共同特点是--属于一个产品. 即 此工厂可以生产产品,而非单独的对象。

实现过程如下:

1)定义一个Factory接口用来创建数据库。(注:db接口是用来连接数据库)

interface Factory{
function createDB();
}

2)定义连接工厂

 class mysqlFactory implements Factory{
public function createDB(){
return new dbmysql();
}
} class sqliteFactory implements Factory{
public function createDB(){
return new dbsqlite();
}
}

3)客户端可以调用工厂

$fact=new mysqlFactory();
$db=$fact>createDB();
$db->$conn();

4)当增加了oracle连接方式,我们怎么办了?只需要增加工厂和方法就可以了,无需去修改factory。

 class dboracle implements db(){
public function conn(){
echo "连接到了oracle";}
} class oracleFactory implements Factory(){
public function createDB(){
return new dboracle();
}
}

5)这样可以直接调用了

$fact=new oracleFactory();
$db=$fact>createDB();
$db->$conn();

最新文章

  1. node学习笔记
  2. 【go语言】RSA加解密
  3. ActiveReports 报表应用教程 (1)---Hello ActiveReports
  4. java作业2
  5. java数据结构和算法------希尔排序
  6. 无root权限安装python
  7. 【oracle】oracle函数-数值函数
  8. C++11内存模型的粗略解释
  9. P2158 [SDOI2008]仪仗队 线性筛(欧拉函数和素数表)
  10. 让asp.net web api同时支持[AcceptVerbs(&quot;GET&quot;,&quot;POST&quot;)]
  11. CentOS 6.7平台Hadoop 1.2.1环境搭建
  12. SQL 语句优化—— (一) 操作符优化
  13. ssh三大框架,三层架构 整合测试!完整分页代码,JdbcTemplate等测试,存储过程调用,留着以后复习吧
  14. 【2】Chrome - 快捷键
  15. Matplotlib图例
  16. 原生js实现删除class和添加class
  17. vue源码分析之new Vue过程
  18. jupyter-notebook快捷键
  19. 遭遇ASP.NET的Request is not available in this context
  20. linux 一些命令(2)

热门文章

  1. Delphi日期函数、日期加减
  2. python基础知识---操作文件
  3. Mac下Call to undefined function imagettftext() 解决方案
  4. UNDO
  5. HostOnly Cookie和HttpOnly Cookie
  6. inotifywait命令
  7. js 动态添加行,删除行,并获得select中值赋予 input
  8. MFC 给对话框注册热键
  9. Qt中让Qwidget置顶的方法
  10. S5PV210的电阻触摸屏&amp;ADC控制器