PHP设计模式之工厂模式
在讲之前先做一个比喻,现在我需要生产一批货。
我首先需要2000件上衣,那么我发单上写的是:
代工工厂名称:XX上衣厂
货物需求数量:2000件
货物种类:上衣
联系人:李先生
电话:123
我还需要3000条牛仔裤,那么我发单上写的是:
代工工厂名称:YY牛仔裤厂
货物需求数量:3000条
货物种类:牛仔裤
联系人:洪小姐
电话:123
XX上衣厂和YY牛仔裤厂的地址是不一样的,需要把这2个文件送到 2个不同的地址。
假如我还需要鞋子,帽子,围巾,那我就需要联系更多的工厂,需要的成本也增加不少,还需要维持每个产的关系,要是有个厂关闭了,等等头痛的问题。
我会想,要是有一个工厂(Z工厂)可以又做上衣又做裤子,那么我可以节约很多成本,首先联系人只有一个了,电话只有一个了,地址只有一个了。
那么我就只需要直接告诉Z工厂信息:2000件上衣 或者 3000条牛仔裤,由他们厂来把不同的货物种类分配到不同的车间进行生产。
那么我发单上写的是:
货物需求数量:2000件
货物种类:上衣
货物需求数量:3000条
货物种类:牛仔裤
简单快捷的发送信息,返回给我的是一样的货物(2000件上衣 或者 3000条牛仔裤).
回到主题中来,设置模式中的工厂模式就可以解决我们在程序中遇到的同类型的问题。
通常工厂类返回的也是一个符合类似接口的类,根据参数的不同或者配置信息的不同来创建一种专门用来实例化并且返回其他类的事例的类。
在程序中我们比较常见的就是数据库的操作问题,我们程序可以操作很多数据库,但是每种不同数据的操作函数,参数等等都不一样。当我们一个项目的数据要移植到另一个不同的数据库上的时候,我们就需要修改很多代码来位置应用程序的正常工作。工厂模式就在这里很有用了,用工厂模式来设置数据库操作模块,我们可以做到只需要修改一下配置文件中数据库的配置文件,或者修改一下操作数据库函数的参数就可以很方便的切换到另一个种完全不同的数据库,不需要对程序代码进行任何的修改。
代码清单:使用工厂模式解决数据库可移植问题
interface Idatabase
{
//定义数据库类的契约
}
class Mysql
{
//some thing
}
class Mssql
{
//some thing
}
//还可以有更多种数据库...
class DbFactory
{
public static function factory()
{
$type = getDatabaseType();
switch () {
case 'mysql' :
return new Mysql();
break;
case 'mssql' :
return new Mssql();
break;
//more...
}
}
}
//用法
$db = DbFactory::factory();
POSTED ON 2010年06月10日,