PHP 设计模式之二——工厂模式

定义

工厂模式的使用频率比较高。它的定义为:定义一个类,该类主要负责系统的去实例化一些其它的类。通俗点说就是,你告诉我你需要哪个类的实例即可,其它的你不用管,我帮你去实例化,你只管用即可。

工厂对象可能会动态地创建产品对象的类,或者从对象池中返回一个对象,或者对所创建的对象进行复杂的配置,或者应用其他的操作。从定义上看,单例模式也是一种工厂模式的实现,因为它为你实例化了一个特定的对象供系统使用。

应用实例

  1. 数据库驱动:各个 WEB 框架的数据库驱动逻辑,其中就有工厂模式的影子。大多数的框架会支持多种数据库如 oracle / mysql / sql server 等,此时在配置项里,只需提供一下约定好的数据库平台的字符串名称即可,无需自己实例化数据库驱动。 WEB 框架收到要实例化的数据库名称后,调用工厂模式方法,实例化相应的数据库驱动后,供后续代码使用。

  2. 连接邮件服务器的类:可以连接邮件服务器的方法有 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 下加入相应的驱动文件即可,当然要符合相应驱动规则。

优点

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。封装了实例化过程,使用者不在需要关心过多的实例化过程,只需要提供约定好的实例化标识即可。

  2. 扩展性高,如果想增加一个“产品”,只要扩展一个工厂类或者是修改工厂的生产过程即可。 3. 屏蔽产品的具体实现,调用者只关心产品的接口,产品类不论如何变化都不再影响其实例化过程。

缺点

  1. 每次增加一个产品时,都需要增加或者修改一个具体类和对象实现工厂,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

    原文作者:设计模式
    原文地址: https://segmentfault.com/a/1190000010705566
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞