定义
工厂模式的使用频率比较高。它的定义为:定义一个类,该类主要负责系统的去实例化一些其它的类。通俗点说就是,你告诉我你需要哪个类的实例即可,其它的你不用管,我帮你去实例化,你只管用即可。
工厂对象可能会动态地创建产品对象的类,或者从对象池中返回一个对象,或者对所创建的对象进行复杂的配置,或者应用其他的操作。从定义上看,单例模式也是一种工厂模式的实现,因为它为你实例化了一个特定的对象供系统使用。
应用实例
数据库驱动:各个 WEB 框架的数据库驱动逻辑,其中就有工厂模式的影子。大多数的框架会支持多种数据库如 oracle / mysql / sql server 等,此时在配置项里,只需提供一下约定好的数据库平台的字符串名称即可,无需自己实例化数据库驱动。 WEB 框架收到要实例化的数据库名称后,调用工厂模式方法,实例化相应的数据库驱动后,供后续代码使用。
连接邮件服务器的类:可以连接邮件服务器的方法有 POP3,IMAP,HTTP ,此时可以写一个工厂类负责实例化这几种连接方法,如果某一天对方增加了 webSerives 连接方法,那么直接在工厂类里做相应的修改即可。
代码举例
class ConnectionFactory
{
function static getConnection($db_class_name)
{
$db_class_name = strtolower($db_class_name);
if (include_once 'Drivers/' . $db_class_name . '.php') {
$classname = 'Driver_' . $db_class_name;
return new $db_class_name;
} else {
throw new Exception ('The specify class driver file didn not found. ');
}
}
}
ConnectionFactory::getConnection("mysql");
ConnectionFactory::getConnection("oracle");
如果有了新的数据库驱动类,只需要在 drivers 下加入相应的驱动文件即可,当然要符合相应驱动规则。
优点
一个调用者想创建一个对象,只要知道其名称就可以了。封装了实例化过程,使用者不在需要关心过多的实例化过程,只需要提供约定好的实例化标识即可。
扩展性高,如果想增加一个“产品”,只要扩展一个工厂类或者是修改工厂的生产过程即可。 3. 屏蔽产品的具体实现,调用者只关心产品的接口,产品类不论如何变化都不再影响其实例化过程。
缺点
每次增加一个产品时,都需要增加或者修改一个具体类和对象实现工厂,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。