php设计模式总结-工厂模式

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 使用工厂模式的目的或目标?工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样随时可以产生一个新的对象。减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码。通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。

使用工厂模式的目的或目标?

工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样随时可以产生一个新的对象。
减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码。

通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。
假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设某天需要把a类的名称修改,意味着很多调用的代码都要修改。



工厂模式的优点就在创建对象上。
工厂模式的优点就在创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,
创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。

每个类可能会需要连接数据库。那么就将连接数据库封装在一个类中。以后在其他类中通过类名:

为什么引入抽象的概念?
想一想,在现实生活中,当我们无法确定某个具体的东西的时候,往往把一类东西归于抽象类别。
工厂方法:
比如你的工厂叫做“香烟工厂”,那么可以有“七匹狼工厂”“中华工厂”等,但是,这个工厂只生厂一种商品:香烟;
抽象工厂:无法描述它到底生产什么产品,它生产很多类型的产品(所以抽象工厂就会生成子工厂)。
你的工厂是综合型的,是生产“一系列”产品,而不是“一个”,比如:生产“香烟”,还有“啤酒”等。然后它也可以有派生出来的具体的工厂,但这些工厂都是生产这一系列产品,只是可能因为地域不一样,为了适应当地人口味,味道也不太一样。
工厂模式:理解成只生成一种产品的工厂。比如生产香烟的。
工厂方法:工厂的一种产品生产线 。比如键盘的生成过程。



别人会反驳:吃饱了没事干,一定要修改类名称呢?这个说不定。一般都不会去修改类名称。






其实工厂模式有很多变体,抓住精髓才是关键:只要是可以根据不同的参数生成不同的类实例,那么就符合工厂模式的设计思想。

这样子让我联想到框架中经常会有负责生成具体类实例的方法供调用。

由于前面使用过phpcms,用phpcms的来帮助理解,更加好,如下:


pc_base:load_app_class("order"');//参数名称就是类名称。将会生成得到order这个实例。传递不同的参数得到不同的类实例,这个就符合工厂模式。



pc_base:load_app_class("comment"');//生成一个comment类实例

//当然load_app_class这个方法里面还会结合了单件模式的思想。避免调用n次,就重复创建n个相同的实例









工厂模式我想到的一个典型的应用就是:php可能要链接mysql,也可能要链接sqlserver,还有其他什么数据库。那么做一个抽象的数据库类,

这个类就是一个工厂类,专门负责产生不同的对象。

这样子做很方便扩展。我们在直接链接数据库的时候,不是使用代码new Mysql($host,$username,$password,$dbname)的形式

而可以动态生成一个连接数据库的实例。可以是mysql,也可以是连接oracle的。

class DbFactory
{

function static factory($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 ('对应的数据库类没找到');
        }


}




}



DbFactory::factory("mysql");

DbFactory::factory("oracle");



在thinkphp框架中也有对应的实现:

Db.class.php就是一个工厂类(也可以叫做数据库中间层,之所以叫做中间层,是因为可以操作mysql、oracle等各数据库。而这个类就是中间层作用,屏蔽掉具体的实现。让程序员可以不改动原来的查询代码。中间层来对接mysql、oracle等数据库。



Db.class.php中有个factory()方法来创建不同的数据库实例

    public function factory($db_config='') {
        // 读取数据库配置
        $db_config = $this->parseConfig($db_config);
        if(empty($db_config['dbms']))
            throw_exception(L('_NO_DB_CONFIG_'));
        // 数据库类型
        $this->dbType = ucwords(strtolower($db_config['dbms']));
        $class = 'Db'. $this->dbType;
        if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
            // 内置驱动
            $path = CORE_PATH;
        }else{ // 扩展驱动
            $path = EXTEND_PATH;
        }
        // 检查驱动类
        if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
            $db = new $class($db_config);
            // 获取当前的数据库类型
            if( 'pdo' != strtolower($db_config['dbms']) )
                $db->dbType = strtoupper($this->dbType);
            else
                $db->dbType = $this->_getDsnType($db_config['dsn']);
            if(APP_DEBUG)  $db->debug    = true;
        }else {
            // 类没有定义
            throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);
        }
        return $db;
    }





还有做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来,做成接口形式,让所有的子类都要实现它的接口。以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。


书籍<php权威编程>(英文名称为PHP 5 Power Programming)也提到一个工厂模式的例子,学到一招:在为用户注册的时候,分为很多种角色的用户。比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,代码也容易维护,为每种角色可以生成操作的类。

定义以下几个类:

UserFactory 用户工厂类,负责生成不同的用户类
User:用户类的基类,所有用户类都是继承这个类
不同角色的类:注册用户类、匿名用户类、管理员用户类

 

 

总结结束,欢迎指正!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
11 0
|
16天前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
10 0
|
16天前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
13 0
|
9月前
|
设计模式 数据库连接 PHP
PHP设计模式21-工厂模式的讲解及应用
PHP快速入门与实战学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常优雅,避免出错,也能更好的扩展和维护我们的项目。
107 32
|
9月前
|
Shell Linux PHP
PHP CLI的命令行模式的理解
PHP CLI的命令行模式的理解
57 0
|
安全 PHP Apache
apache默认是哪种模式运行PHP?底层原理是什么?
apache默认是哪种模式运行PHP?底层原理是什么?
145 0
|
Unix 应用服务中间件 PHP
nginx默认是哪种模式运行PHP?底层原理是什么?
nginx默认是哪种模式运行PHP?底层原理是什么?
116 0
|
安全 PHP Apache
为什么apache默认不是fastcgi模式运行PHP?底层原理是什么?
为什么apache默认不是fastcgi模式运行PHP?底层原理是什么?
|
设计模式 缓存 数据库连接
PHP的设计模式的使用场景是什么?底层原理是什么?
PHP的设计模式的使用场景是什么?底层原理是什么?
175 0
|
监控 应用服务中间件 PHP
PHP 本身支持 CGI、FastCGI、mod_php、php-fpm的模式区别是什么?底层原理是什么?
PHP 本身支持 CGI、FastCGI、mod_php、php-fpm的模式区别是什么?底层原理是什么?
108 0