标签:
工厂模式精髓:只要是可以根据不同的参数生成不同的类实例,那么就符合工厂模式的设计思想。
一:工厂模式的优点
工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样可以提高复用性,减少耦合关系重,牵一发动其他部分代码。
eg:在不使用工厂模式的时候:假如很多地方调用类User,我们就会在需要的地方这样子写:new User(),假设某天需要把User类的名称修改,那就是个灾难。
二:我们什么时候要使用工厂模式?
比如我们做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。方便未来扩展,设计成工厂模式。
定一个专门生产网关接口的工厂,抽象出来,做成接口形式,让所有的子类都要实现它的接口。以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。
工厂模式我想到的一个典型的应用就是:php可能要链接mysql,sqlserver 或oracle,还有其他什么数据库。那么做一个抽象的数据库类,
这个类就是一个工厂类,专门负责产生不同的对象。
这样子做很方便扩展。我们在直接链接数据库的时候,不是使用代码new Mysql($host,$username,$password,$dbname)的形式
而可以动态生成一个连接数据库的实例。可以是mysql,也可以是连接oracle的。
class DbFactory { function static factory($db_class_name) { $db_class_name = strtolower($db_class_name); if (include_once ‘Drivers/‘ . $db_class_name . ‘.php‘) { $classname = ‘Driver_‘ . $db_class_name; return new $db_class_name; } else { throw new Exception(‘对应的数据库类没找到‘); } } } DbFactory::factory("mysql"); DbFactory::factory("oracle");
可参考TP框架中Db.class.php就是一个工厂类(也可以叫做数据库中间层,之所以叫做中间层,是因为可以操作mysql、oracle等各数据库。而这个类就是中间层作用,屏蔽掉具体的实现。让程序员可以不改动原来的查询代码。中间层来对接mysql、oracle等数据库。
定义以下几个类:
UserFactory 用户工厂类,负责生成不同的用户类
User:用户类的基类,所有用户类都是继承这个类
不同角色的类:注册用户类、匿名用户类、管理员用户类
标签:
原文地址:http://www.cnblogs.com/ID890/p/890_gcms.html