一.接口继承直接调用

先看看这样一段代码:

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

浅谈php设计模式(1)---工厂模式的更多相关文章

  1. 浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  2. 浅谈cocos2dx(18) 中工厂模式

    ----我的生活.我的点点滴滴! ! cocos2d-x中也有工厂模式.何为工厂模式,顾名思义就是用来产生产品的,工厂就是用来创建其它类对象的类,我们把这个创建其它类对象的类叫做工厂类.而这些被创建的 ...

  3. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  4. 浅谈C++设计模式之工厂方法(Factory Method)

    为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...

  5. 浅谈js设计模式 — 享元模式

    享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 假设有个内衣工厂,目前的产品有 50种男式内 ...

  6. 浅谈js设计模式之代理模式

    代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理.如果想请明星来办一场商业演出,只能联系他的经纪人.经纪人会把商业演出的细节和报酬都谈好之后,再把合同交 ...

  7. 浅谈Python设计模式 - 享元模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 享元模式: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思 ...

  8. 浅谈js设计模式之迭代器模式

    迭代器模式无非就是循环访问聚合对象中的各个元素.比如 jQuery中的 $.each 函数,其中回调函数中的参数 i 为当前索引, n 为当前元素,代码如下: $.each([1, 2, 3], fu ...

  9. 浅谈js设计模式之策略模式

    策略模式有着广泛的应用.本节我们就以年终奖的计算为例进行介绍. 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为 S的人年终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而 ...

随机推荐

  1. zend framework2 下载及安装

    1.安装XAMPP 2.安装zend studio 3.在GITHUB上下载一个zendframework模板,插入到IDE中 4.将下载的zend framework2文件夹解压放在vendor文件 ...

  2. 10个顶级的CSS UI开源框架

    随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验.作为开发者,我们需要了解一些宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现 ...

  3. http协议get、post请求分析及用HttpRequester测试的报错及可能原因

    1.get.post区别 Get Post 获取/提交数据 主要获取数据,不修改数据 主要提交数据,可修改数据 是否需要form表单 不一定 需要 安全性 查询字符串会显示在地址栏的URL中,不安全. ...

  4. 对病毒Virus.Win32.Ramnit.B的研究

  5. Waitforsingleobject 函数的用法

    用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法. 但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力.这时,只能考虑 ...

  6. DOM Document

    1.DOM Document对象 定义:每个载入浏览器的 HTML 文档都会成为 Document 对象.Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. Docume ...

  7. [专题论文阅读]【分布式DNN训练系统】 FireCaffe

    FireCaffe Forrest N. Iandola FireCaffe: near-linear acceleration of deep neural network training on ...

  8. js 动态添加行,删除行,并获得select中值赋予 input

    <html> <head>  <title>Ace Test</title>  <script type="text/javascrip ...

  9. UIImagePickerController的知识点

    1.UIImagePickerController是系统提供的用来获取图片或视频的接口,使用UIImagePickerController类来获取图片的基本步骤如下: a.初始化UIImagePick ...

  10. VC 使用OnCtlColor函数来改变控件颜色(引用)

    在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:afx_msg HBRUSH OnC ...