@a5635268
2016-02-29T03:57:57.000000Z
字数 2231
阅读 1313
PHP 设计模式
定义一个用于创建对象的接口(工厂方法),通过这个方法去决定实例什么类。而这个实例什么类,又通过另外的一个工厂方法实例化延迟到其子类;

不同的产品通过不同的工厂加工,然后再通过一个统一的工厂返回最终的结果。
优点: 工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
缺点: 客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
在同一操作下实现不同的内部逻辑:比如 实例数据库链接对象的方法,可以实例不同类型的数据库
Example1
/*** 抽象工厂角色*/interface Creator {public function factoryMethod();}/*** 具体工厂角色A*/class ConcreteCreatorA implements Creator {/*** 工厂方法 返回具体 产品A* @return ConcreteProductA*/public function factoryMethod() {return new ConcreteProductA();}}/*** 具体工厂角色B*/class ConcreteCreatorB implements Creator {/*** 工厂方法 返回具体 产品B* @return ConcreteProductB*/public function factoryMethod() {return new ConcreteProductB();}}/*** 抽象产品角色*/interface Product {public function operation();}/*** 具体产品角色A*/class ConcreteProductA implements Product {/*** 接口方法实现 输出特定字符串*/public function operation() {echo 'ConcreteProductA <br />';}}/*** 具体产品角色B*/class ConcreteProductB implements Product {/*** 接口方法实现 输出特定字符串*/public function operation() {echo 'ConcreteProductB <br />';}}class Client {/*** Main program.*/public static function main() {$creatorA = new ConcreteCreatorA();$productA = $creatorA->factoryMethod();$productA->operation();$creatorB = new ConcreteCreatorB();$productB = $creatorB->factoryMethod();$productB->operation();}}Client::main();
Example2
/*** 工厂方法模式* 定义一个用于创建对象的接口,让子类决定将哪一个类实例化,使用一个类的实例化延迟到其子类*//*class DBFactory{public static function create($type){swtich($type){case "Mysql":return new MysqlDB();case "Postgre":return new PostgreDB();case "Mssql":return new MssqlDB();}}}# 面向对象设计原则: http://developer.51cto.com/art/201206/340930.htm# 面向对象的主要原则就是: 把修改关闭,把扩展打开;如果不使用工厂模式,我们每增加一个数据库类型就要修改源码,这不符合面向对象的设计原则*///具体工厂class DBFactory{public static function create($type){$class = $type . "DB";return new $class;}}//抽象产品interface DB{public function connect();public function exec();}//具体产品1class MysqlDB implements DB{public function __construct(){echo "mysql db<br/>";}public function connect(){}public function exec(){}}//具体产品2class PostgreDB implements DB{public function __construct(){echo "Postgre db<br/>";}public function connect(){}public function exec(){}}//具体产品3class MssqlDB implements DB{public function __construct(){echo "mssql db<br/>";}public function connect(){}public function exec(){}}# client$oMysql = DBFactory::create("Mysql");$oPostgre = DBFactory::create("Postgre");$oMssql = DBFactory::create("Mssql");
