抽象工厂模式,是工厂方法模式的演变,而工厂方法模式,是简单工厂模式的进化。抛弃了应用的条件控制语句,无论是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);

个人认为:这种方式的数据库应用代码设计,仍旧是很繁琐的,每增加一张表,需要增加各个类型的数据库类各一个。所以,本例仅仅是为了演示说明抽象工厂模式。

标签: PHP, 设计模式, 抽象工厂模式

添加新评论