@a5635268
2016-02-29T11:57:57.000000Z
字数 2231
阅读 1148
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();
}
//具体产品1
class MysqlDB implements DB{
public function __construct(){
echo "mysql db<br/>";
}
public function connect(){
}
public function exec(){
}
}
//具体产品2
class PostgreDB implements DB{
public function __construct(){
echo "Postgre db<br/>";
}
public function connect(){
}
public function exec(){
}
}
//具体产品3
class 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");