工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类

应用场景:连接数据库,可以使用mysql 、mysqli、pdo,根据不同参数配置使用不同的数据库操作类

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

在为用户注册的时候,分为很多种角色的用户。
比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,
代码也容易维护,为每种角色可以生成操作的类等等。

<?php
/*** Created by PhpStorm.* User: Ty_Ro* Date: 2019/1/15* Time: 10:35*//*** 抽象产品(共同接口)* @定义一个工厂接口*/
interface  mysql{public function connect();
}/*** Class mysqli2* 具体产品实现* @实现这个接口*/
class mysqli2  implements mysql{public  function connect(){echo 'mysqli';}
}/*** Class pdo2* 具体产品实现* @实现这个接口*/
class pdo2 implements mysql{public function connect(){echo 'pdo';}
}/*** Class mysqlFactory* 通过传入不同的参数来实例化不同的对象;统一在工厂类中进行实例化*/
class mysqlFactory{static public function factory($class_name){return new $class_name();}}$obj = mysqlFactory::factory('pdo2');
$obj->connect();

class mysqlFactory{
 
 
    static public function factory($class_name){
        return new $class_name();
    }
 
}
 
$obj = mysqlFactory::factory('pdo2');
$obj->connect();

在laravel中使用工厂模式需要注意命名空间,否则容易报错类找不到

工厂类:

<?php
/*** Created by PhpStorm.* User: Ty_Ro* Date: 2019/1/15* Time: 10:35*/
namespace App;interface  mysql{public function connect();
}class mysqli2  implements mysql{public  function connect(){echo 'mysqli';}
}class pdo2 implements mysql{public function connect(){echo 'pdo';}
}class MyFactory  {/*** @var array*/protected $typeList;/*** 你可以在这里注入自己的车子类型*/public function __construct(){$this->typeList = array('pdo2' => __NAMESPACE__ . '\pdo2','mysqli2' => __NAMESPACE__ . '\mysqli2');}public function factory($type){if (!array_key_exists($type, $this->typeList)) {throw new \InvalidArgumentException("$type is not valid vehicle");}$className = $this->typeList[$type];return new $className();}}

调用工厂类

<?php
/*** Created by PhpStorm.* User: Ty_Ro* Date: 2019/1/15* Time: 10:27*/namespace App\Http\Controllers\DesignMode;use App\Http\Controllers\Controller;
use App\MyFactory;class FactoryPatternController extends Controller
{public function newFactory() {$obj = new MyFactory;$obj->factory('pdo2')->connect();}
}

php工厂模式及laravel中工厂模式相关推荐

  1. 8086的两种工作模式_8086系统中最小模式与最大模式两种工作方式的主要区别是什么?...

    展开全部 最小模式和最大模式的主要区别为以下几方面: 1.处理系统方面 最小模式:系统里e68a843231313335323631343130323136353331333366306533就808 ...

  2. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  3. python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?

    其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚 python有一个很有意思的地方,就是def函数可以嵌套在另一个def函数之中.调用外层函数时,运行到的内层def语句仅仅是完成对内层函数的定义,而不 ...

  4. 设计模式-工厂模式的3中不同实现[JAVA]

    设计模式-工厂模式的3中不同实现[JAVA] 工厂模式简介 In Factory pattern, we create object without exposing the creation log ...

  5. android menu夜间模式,Android常用技巧夜间模式开发浅析

    前言 Android的夜间模式主要主用于阅读方面,在QQ,微信读书,新闻阅读类一般会有相应的功能,本文主要介绍整体APP的夜间模式以及webview中夜间模式的实现. 效果图展示 功能实现简介 APP ...

  6. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  7. mave工程中的一个类调用另一个聚合工程的一个类_谈谈设计模式:建造者模式在jdk中的体现,它和工厂模式区别?...

    背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们也许 ...

  8. java中的工厂模式_java中工厂模式详解和使用方法

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...

  9. 手把手教你应用三种工厂模式在SpringIOC中创建对象实例【案例详解】

    目录 一.工厂模式介绍 二.通过静态工厂方法创建Bean实例 三.通过实例工厂方法创建Bean实例 四.通过自定义的factoryBean来创建bean对象 Hello,你好呀,我是灰小猿!一个超会写 ...

最新文章

  1. 如何到top5%?NLP-情感分析实战训练来教你!
  2. Django Rest Framework
  3. 批处理——服务器的web文件备份
  4. C#算法设计查找篇之02-二分查找
  5. Spring4.0编程式定时任务配置
  6. 解除工作压力的四大疗法
  7. opcache引起的“php-cgi.exe - FastCGI 进程意外退出”,事件ID487
  8. 如何在 iPhone 和 iPad 上使用语音备忘录?
  9. win10 开机启动_win10 -- 取消不需要的开机启动项和服务项加快win10系统开机速度...
  10. 汇编中DOSBox的使用
  11. 如何下载Chrome历史版本
  12. Windows Server 2019 安装应用商店
  13. python模拟鼠标拖动_python模拟鼠标拖动教程
  14. laravel admin grid文档
  15. Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
  16. 使用espressos idlingresource获得最高的Android测试速度
  17. BPM业务流程管理的前世今生
  18. 2019腾讯游戏客户端面试
  19. 前端面试技巧和注意事项_web前端没有项目经验怎么应对面试?(技巧) -
  20. 【scrapy 动态配置爬虫】同进程多爬虫,基础事例

热门文章

  1. (五)CelebA CelebA-HQ
  2. (C语言)八大排序之:基数排序
  3. 第一周 用HTML制作的所有网页
  4. 软件测试实验室质量监督计划,试验室质量监督计划
  5. 线程+线程池【面试题】
  6. 编程英语:常见代码错误 error 语句学习(6)
  7. 基于javascript的div浮动效果代码
  8. 学会python需要数学吗_机器学习数学基础:学习线性代数,千万不要误入歧途!推荐一个正确学习路线...
  9. 因酷教育系统环境配置教程
  10. 快手、知乎等平台严厉打击“病媛”炒作行为:自媒体行业不能被流量裹挟