看代码学设计模式之工厂模式

小文blog小文 2016-11-29 08:52 1588人围观

简单工厂模式

/*简单工厂代码示例*/
class DBFactory{
    public static function create($type){
        swtich($type){
            case "Mysql":
                return new MysqlDB(); break;
            case "Postgre":
                return new PostgreDB(); break;
            case "Mssql":
                return new MssqlDB(); break;
        }
    }
}
$oMysql= DBFactory::create("Mysql");
$oPostgre= DBFactory::create("Postgre");
$oMssql= DBFactory::create("Mssql");
优点

客户端不需要修改代码。

缺点

当需要增加新的数据库类的时候,不仅需新加数据库类,还要修改工厂类,违反了开闭原则。

工厂模式

/**
* 工厂方法模式
*
* 定义一个用于创建对象的接口,让子类决定将哪一个类实例化,使用一个类的实例化延迟到其子类
*/
class DBFactory{
	public static function create($type){
		$class = $type."DB";
		return new $class;
	}
}

interface DB{
	public function connect();
	public function exec();
}

class MysqlDB implements DB{
	public function __construct() {
		echo "连接到mysql!<br />";
 	}
	public function connect() {
	}
	public function exec() {
	}
}
class PostgreDB implements DB{
	public function __construct() {
		echo "连接到postgre!<br />";
 	}
	public function connect() {
	}
	public function exec() {
	}
}
class MssqlDB implements DB{
	public function __construct() {
		echo "连接到mssql!<br />";
 	}
	public function connect() {
	}
	public function exec() {
	}
}

$oMysql= DBFactory::create("Mysql");
$oPostgre= DBFactory::create("Postgre");
$oMssql= DBFactory::create("Mssql");

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

优点

增加一个数据库类(例如redis类),只需要增加数据库类和相对应的工厂,两个类,不需要修改工厂类。

缺点

增加数据库类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

浏览器输出

factory.png


转载请注明来自小文blog,本文标题:看代码学设计模式之工厂模式

发布评论
生活是一场戏,主角当累了,你亦可成为观众,停下脚步,歇一歇