浅谈php设计模式(1)---工厂模式

一.接口继承直接调用

先看看这样一段代码:


 1 <?php
2
3 interface db{
4 function conn();
5 }
6
7 class dbmysql implements db {
8 public function conn(){
9 echo "连接到了mysql";
10 }
11 }
12
13 class dbsqlite implements db{
14 public function conn(){
15 echo "连接到了sqlite";
16 }
17 }
18
19 ?>

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

1 $db=new dbmysql();
2 $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)定义连接工厂


 1 class mysqlFactory implements Factory{
2 public function createDB(){
3 return new dbmysql();
4 }
5 }
6
7 class sqliteFactory implements Factory{
8 public function createDB(){
9 return new dbsqlite();
10 }
11 }

3)客户端可以调用工厂

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

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


 1 class dboracle implements db(){
2 public function conn(){
3 echo "连接到了oracle";}
4 }
5
6 class oracleFactory implements Factory(){
7 public function createDB(){
8 return new dboracle();
9 }
10 }

5)这样可以直接调用了

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

浅谈php设计模式(1)---工厂模式,布布扣,bubuko.com

时间: 2024-12-25 11:52:34

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

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

享元(flyweight)模式是一种用于性能优化的模式,"fly"在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 假设有个内衣工厂,目前的产品有 50种男式内衣和 50种女士内衣,为了推销产品,工厂决定生产一些塑料模特来穿上他们的内衣拍成广告照片. 正常情况下需要 50 个男模特和 50 个女模特,然后让他们每人分别穿上一件内衣来拍照.不使用享元模式的情况下,在程序里也许会这样写: var Model = function(sex, under

浅谈JAVA设计模式之——外观模式

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45568655 一.概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变得越来越 复杂.大多数模式使用时都会产生更多更小的类.这使得子系统更具可重用性,也更容 易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困

浅谈JAVA设计模式之——工厂方法(FactoryMethod)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45440937 一.概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 二.适用性 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候. 三.参与者 1.Produc

浅谈JAVA设计模式之——桥接模式(Bridge)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45457969 一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充. 这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充. 3.对一

浅谈JAVA设计模式之——状态模式(State)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45600711 一.概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. 这个状态通常用一个或多个枚举常量表示. 通常,有多个操作包含这一相同的条件结构. Sta

浅谈JAVA设计模式之——命令模式(Command)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45569323 一.概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 二.适用性 1.抽象出待执行的动作以参数化某对象. 2.在不同的时刻指定.排列和执行请求. 3.支持取消操作. 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 5.用构建在原语操作上的高层操作构造一个系统. 三.参与者 1.Co

浅谈JAVA设计模式之——代理模式(proxy)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45568963 一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表. 2.虚代理(VirtualProxy)根据需要创建开销很大的对象. 3.保护代理(ProtectionProxy)控制对原始对象的访问. 4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行

浅谈JAVA设计模式之——组合模式(Composite)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45458081 一.概述 将对象组合成树形结构以表示"部分-整体"的层次结构."Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分-整体层次结构. 2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象. 三.参与者 1.Component 为组合中的对象声明接口. 在适当的情况下,实现

浅谈JAVA设计模式之——迭代器模式(interator)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45599951 一.概述 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 二.适用性 1.访问一个聚合对象的内容而无需暴露它的内部表示. 2.支持对聚合对象的多种遍历. 3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代). 三.参与者 1.Iterator 迭代器定义访问和遍历元素的接口. 2.ConcreteItera