一,抽象工厂模式(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),即可对扩展功能开放,对内部修改关闭,即新增功能都以模块化创建,原来模块不用需改;
测试评论
测试回复
测试评论2, 看看是否能识别同一个人