一.接口继承直接调用

先看看这样一段代码:

 <?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. 7、SQL Server索引、表压缩

    索引 什么是索引? 索引是一种磁盘上的数据结构,建立在表或视图的基础上.使用索引可以使数据的获取更快更高校,也会影响其他的一些性能,如插入或更新等. 索引主要分为两种类型:聚集索引和非聚集索引. 字典 ...

  2. hibernate框架之-查询结果集返回类型

    Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...

  3. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案

    1 设置c:windows\temp 目录访问权限 temp--> 属性-->安全-- > 添加network service -->并赋予其权限为 读 和 写--> 确 ...

  4. Python自动化 【第十七篇】:jQuery介绍

    jQuery jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多),对javascript进行了封装,是的更加便捷的开发,并且在 ...

  5. LR自定义函数以及调用

    2.2.自定义函数以及调用 2.2.1.虚拟用户编程,使用C# 语言DLL 在VS中建立DLL类库项目,编写函数时使用public声明:实现函数后编译生成DLL: 在LR中建立 .Net Vuser脚 ...

  6. npm 重点小结

    npm作为javascript一个用得比较广的包管理工具,已经集成在了node里面,基本一安装node就可以用npm了,十分方便.这里的小结主要沿着官方文档的思路,挑出一些比较重点的,平时常用的部分进 ...

  7. python day 1--python初始

    笔者:QQ:   360212316 Python初识 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...

  8. EF 底层基础方法

    1 using System; 2 using System.Data; 3 using System.Collections.Generic; 4 using System.Data.Entity; ...

  9. awk的涂鸦

    awk太牛了,博大精深,学不透,学了不用,又忘. 所以花了一天,自己总结了基础,以后就当字典查(容易忘).有不对的地方,忘大家指出. [ganzl@cmdb ~]$ more /etc/passwd ...

  10. 将golang程序注册为windows服务

    1.go get  bitbucket.org/kardianos/service 2.参考里面的exmaple,就可以了 我承认我有点蛋疼