面向对象的洗礼:设计模式(十五)之抽象工厂模式
抽象工厂模式,是工厂方法模式的演变,而工厂方法模式,是简单工厂模式的进化。抛弃了应用的条件控制语句,无论是switch还是if-ifelse。是设计模式的一种。
抽线工厂模式来自于方法模式和简单工厂模式的进化与整合,其实,我已经要疯了,23种设计模式,现在已经出现了三种工厂模式。
抽象工厂模式:提供一个创建一系列相关的、相互依赖的对象接口,而无需指定他们的具体类。
对于面向过程的编程,以及套在class里的面向对象的编程,修改起来是大批量的,是非常丑陋的。我常常告诫自己,编程是一门艺术,每个程序员都是艺术家,写出优美的,有艺术感的代码,并且是高效的,低成本的,这就是编程之美!
场景:原本是mysql,现在要换成oracle。以PHP为代码环境。现在有两张表,一个是用户表user,一个是公司表company。
<?php class Db{ private static $dbName = 'mysql'; public static function createUserDbObj(){ $className = self::$dbName . 'UserDbModel'; return new $className(); } public static function createCompanyDbObj(){ $className = self::$dbName . 'CompanyDbModel'; return new $className(); } } interface User{ public function get(); public function set(); } class mysqlUserDbModel implements User{ public function get(){ echo '从Mysql中查找用户记录<br>'; } public function set(){ echo '从Mysql中添加用户记录<br>'; } } class oracleUserDbModel implements User{ public function get(){ echo '从Oracle中查找用户记录<br>'; } public function set(){ echo '从Oracle中添加用户记录<br>'; } } interface Company{ public function get(); public function set(); } class mysqlCompanyDbModel implements User{ public function get(){ echo '从Mysql中查找公司记录<br>'; } public function set(){ echo '从Mysql中添加公司记录<br>'; } } class oracleCompanyDbModel implements User{ public function get(){ echo '从Oracle中查找公司记录<br>'; } public function set(){ echo '从Oracle中添加公司记录<br>'; } } //客户端/接口 $userDbObj = Db::createUserDbObj(); $companyDbObj = Db::createCompanyDbObj(); $userDbObj->get(); $userDbObj->set(); $companyDbObj->get(); $companyDbObj->set();
现在代码的方式,是把选择数据库给写死到程序中了(Db类), 我们可以以更加灵活的方式,比如:
1、配置
config.php <?php define('DB_NAME', 'mysql');
2、文件
$f = fopen('config', 'r'); $config = ''; while(!feof($f)){ $config .= fgets($f); $config .= ' '; } //----------------我是分割线----------- $config = file_get_contents('config'); //------------------------------------------- //$config = 'dbtype:mysql|username:root|password:root'; $config = explode('|', $config); foreach($config as $k=>$c){ $data = explode(':', $c); unset($config[$k]); $config[$data[0]] = $data[1]; } print_r($config);
个人认为:这种方式的数据库应用代码设计,仍旧是很繁琐的,每增加一张表,需要增加各个类型的数据库类各一个。所以,本例仅仅是为了演示说明抽象工厂模式。