686   DesignPatterns Java PHP

一,抽象工厂模式(Abstract Factory)是工厂方法模式的进一步抽象化。

如果你不了解工厂方法模式的,建议先看看我上篇文章:简单工厂模式和工厂方法模式

继续使用工厂方法模式中链接数据库的例子,

工厂方法模式示例代码:

abstract class Connect_abstract{
    abstract function connect();
}

class MySQL extends Connect_abstract{
    public function connect(){
        echo "connect to MySQL"."\n";
    }
}
class Oracle extends Connect_abstract{
    public function connect(){
        echo "connect to Oracle"."\n";
    }
}

// 将工厂类抽象化成接口
abstract class Database_Factoty_abstract{
    abstract function factory();
}
// 具体工厂类提供MySQL数据库链接类
class MySQL_Factory extends Database_Factoty_abstract{
     public function factory() {
        return new MySQL();
    }
}

// 具体工厂类提供Oracle数据库链接类
class Oracle_Factory extends Database_Factoty_abstract{
    public function factory() {
        return new Oracle();
    }
}

echo "\n-------------------------\n";
$mysql = new MySQL_Factory();
$mysql->factory()->connect();

$oracle = new Oracle_Factory();
$oracle->factory()->connect();

上面链接数据库是最终方法都是一样的,比如链接MySQL,最终都是调用同一个MySQL类的同一connect()方法。
如果是在不同操作系统,MySQL链接方法将会出现差异,那么MySQL类的connect()方法必须兼容不同操作系统,而且当新增操作系统时,必须修改这个方法,而这个方法又是所有操作系统中MySQL链接都会调用的,关联性太强了,牵一发而动全身,不便于扩展和维护。

 

 

二,抽象工厂模式很好地解决不同操作系统数据库切换的问题

示例代码如下:

// 根据不同数据库,实现数据库链接的抽象化接口
// 将MySQL数据库链接方式抽象化成接口
abstract class MySQL_abstract{
    abstract function connect();
}
// 将Oracle数据库链接方式抽象化成接口
abstract class Oracle_abstract{
    abstract function connect();
}

// 根据不同操作系统,实现数据库链接的具体类
// Linux系统链接MySQL的具体类
class Linux_MySQL extends MySQL_abstract{
    public function connect(){
        echo "Linux connect to MySQL"."\n";
    }
}
// Linux系统链接Oracle的具体类
class Linux_Oracle extends Oracle_abstract{
    public function connect(){
        echo "Linux connect to Oracle"."\n";
    }
}
// Window系统链接MySQL的具体类
class Window_MySQL extends MySQL_abstract{
    public function connect(){
        echo "Window connect to MySQL"."\n";
    }
}

// Window系统链接Oracle的具体类
class Window_Oracle extends Oracle_abstract{
    public function connect(){
        echo "Window connect to Oracle"."\n";
    }
}

// 根据不同操作系统,创建数据库链接类的抽象化工厂接口 
// Linux系统创建数据库链接类的抽象化工厂
abstract class Linux_Database_Factoty_abstract{
    abstract function mysql_factory();
    abstract function oracle_factory();
}
// Window系统创建数据库链接类的抽象化工厂
abstract class Window_Database_Factoty_abstract{
    abstract function mysql_factory();
    abstract function oracle_factory();
}

// 根据不同操作系统,创建数据库链接类的具体工厂类
// Linux系统创建数据库链接的具体工厂类
class Linux_Database_Factory extends Linux_Database_Factoty_abstract{
    public function mysql_factory() {
        return new Linux_MySQL();
    }
    public function oracle_factory() {
        return new Linux_Oracle();
    }
}

// Window系统创建数据库链接的具体工厂类
class Window_Database_Factory extends Window_Database_Factoty_abstract{
    public function mysql_factory() {
        return new Window_MySQL();
    }
    public function oracle_factory() {
        return new Window_Oracle();
    }
}



echo "\n-------------------------\n";
$linux = new Linux_Database_Factory();
$linux->mysql_factory()->connect();
$linux->oracle_factory()->connect();

echo "\n-------------------------\n";
$window = new Window_Database_Factory();
$window->mysql_factory()->connect();
$window->oracle_factory()->connect();

这里抽象工厂模式主要是将不同的数据库的链接方法抽象化成接口,然后新增具体的实现类继承它,使得不同操作系统可以分别调用不同的数据库链接实例,进一步把数据库链接的实现解耦。
当新增数据库或者新增操作系统时,抽象工厂模式下只需新增抽象化接口和具体实现类,而不需要修改原有的代码。
这也是我们常说的开闭原则(OCP),即可对扩展功能开放,对内部修改关闭,即新增功能都以模块化创建,原来模块不用需改;




3 Responses

Leave a Reply

Your email address will not be published. Required fields are marked *