什么是简单工厂模式?

以下内容来自 ChatCPT 的回答:

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,其主要目的是将对象的创建过程封装在一个单独的类中,以便于在需要创建对象时,只需要通过向该类传递参数即可获取所需的对象,而不必直接实例化对象。

简单工厂模式通常包含一个工厂类,该类中包含一个静态方法,该方法接收不同的参数,并根据不同的参数来创建不同的对象。客户端只需要调用工厂类中的方法,并传递所需的参数即可创建相应的对象。

简单工厂模式可以有效地降低客户端与具体产品类之间的耦合度,提高系统的可扩展性和可维护性,同时也可以使客户端代码更加简洁和易于理解。

讲人话?

今天你上工厂干活,你需要跟这三个人配合才能完成任务:张三,李四,王六。

不使用简单工厂设计模式

  1. 第一件事需要张三跟你拧螺丝,你得自己去喊他,叫他过来跟你拧螺丝。
  2. 第二件事需要李四跟你搬原料,你得自己去喊他,叫他过来跟你搬原料。
  3. 第三件事需要王六跟你扫地板,你得自己去喊他,叫他过来跟你扫地板。

使用了简单工厂设计模式

你昨天喊了半天,每干一件事情都要自己亲自去找人,费事不说,有时候还找不到人,还要看人脸色
今天你学聪明了,叫来了厂长,让他帮你叫人

  1. 第一件事需要张三跟你拧螺丝,你跟厂长说,厂长立马把张三叫过来,跟你一起拧螺丝。
  2. 第二件事需要李四跟你搬原料,你跟厂长说,厂长立马把李四叫过来,跟你一起搬原料。
  3. 第三件事需要王六跟你扫地板,你跟厂长说,厂长立马把王六叫过来,跟你一起扫地板。

这里的核心就是,你找到了靠山,厂长,需要什么资源,找他,需要什么人,找他,他就是工厂模式里面的那个工厂。

有什么用?

假设,你领导让你开发一个机票预定系统,机票来源有多家【去哪儿、携程、欣欣旅游】,客户可以根据自己的喜好,选择购买不同公司的机票。

接到这个需求,你二话不说,拿起键盘噼里啪啦狂敲,瞬间对接好了各家供应商的购票下单逻辑。

<?phpinterface Flight
{/*** 买票了*/public function buyTicket();
}/*** 去哪儿网*/
class QunarFlight implements Flight
{public function buyTicket(){echo '欢迎来到【去哪儿网】购买机票' . PHP_EOL;// 这里省略 210 行代码...}
}/*** 携程*/
class CtripFlight implements Flight
{public function buyTicket(){echo '欢迎来到【携程】购买机票' . PHP_EOL;// 这里省略 180 行代码...}
}/*** 欣欣旅游*/
class CncnFlight implements Flight
{public function buyTicket(){echo '欢迎来到【欣欣旅游】购买机票,这里购买机票折扣很大。' . PHP_EOL;// 这里省略 21 行代码...}
}

系统刷的一下子上线了,顾客来了,开始订票了。
老板乐开了花。

// 顾客A要了一张去哪儿的机票
$customerA = new QunarFlight();
$customerA->buyTicket();// 顾客B要了一张携程的机票
$customerB = new CtripFlight();
$customerB->buyTicket();// 顾客C要了一张欣欣旅游的机票
$customerC = new CncnFlight();
$customerD->buyTicket();

干的很不错,你们公司业务蒸蒸日上,又陆续对接了50家机票供应商。顾客需要什么我就给你 new 什么。:)

$customer1 = new Supplier1Flight();
$customer2 = new Supplier2Flight();
$customer3 = new Supplier3Flight();
$customer4 = new Supplier4Flight();
$customer5 = new Supplier5Flight();
$customer6 = new Supplier6Flight();
$customer7 = new Supplier7Flight();
$customer8 = new Supplier8Flight();
$customer9 = new Supplier9Flight();
...

今天你们公司新入职了个程序媛,她看到这段代码后,呆住了,震惊了,满脸惊讶坐在那里盯着屏幕一动不动,陷入沉思。
你问她:怎么样,代码写得太棒了惊艳到你了是吗?公司的业务全靠它起来的。
妹子回过神来,说:你有没有听说过简单工厂模式
你瞬间炸了?啥?工厂模式?还是简单的??那玩意有啥用?别整那些有的没的,好好看代码,等下安排任务给你了。
要强的你,下班后,偷偷网上google了一下,看了180篇相关的文章,默默留下无知的眼泪,拿起键盘又一阵狂敲。

/*** 我是机票工厂,你要哪家供应商的机票,跟我说名字就行,我拿给你*/
class FlightFactory
{public static function getFlightSupplier(string $supplierName){switch ($supplierName) {case 'qunar':return new QunarFlight();case 'ctrip':return new CtripFlight();case 'cncn':return new CncnFlight();default:throw new \http\Exception\InvalidArgumentException('你选择供应商我们暂时还没接入,请你先选择其他供应商下单,我们将尽快接入');}}
}// 顾客A要欣欣旅游的机票
$customerA = FlightFactory::getFlightSupplier('cncn');
// 顾客B要携程的票
$customerB = FlightFactory::getFlightSupplier('qunar');
// 顾客C要去哪儿的票
$customerC = FlightFactory::getFlightSupplier('ctrip');
// 顾客D要途牛的票
$customerD = FlightFactory::getFlightSupplier('tuniu');

Laravel源码中,有没有用到该设计模式的地方?

这里使用的是 Laravel 8.83.27
具体使用:根据配置信息返回不同的数据库连接对象

<?phpnamespace Illuminate\Database\Connectors;use Illuminate\Contracts\Container\Container;
use Illuminate\Database\Connection;
use Illuminate\Database\MySqlConnection;
use Illuminate\Database\PostgresConnection;
use Illuminate\Database\SQLiteConnection;
use Illuminate\Database\SqlServerConnection;
use Illuminate\Support\Arr;
use InvalidArgumentException;
use PDOException;class ConnectionFactory
{/*** Create a connector instance based on the configuration.** @param  array  $config* @return \Illuminate\Database\Connectors\ConnectorInterface** @throws \InvalidArgumentException*/public function createConnector(array $config){if (! isset($config['driver'])) {throw new InvalidArgumentException('A driver must be specified.');}if ($this->container->bound($key = "db.connector.{$config['driver']}")) {return $this->container->make($key);}switch ($config['driver']) {case 'mysql':return new MySqlConnector;case 'pgsql':return new PostgresConnector;case 'sqlite':return new SQLiteConnector;case 'sqlsrv':return new SqlServerConnector;}throw new InvalidArgumentException("Unsupported driver [{$config['driver']}].");}/*** Create a new connection instance.** @param  string  $driver* @param  \PDO|\Closure  $connection* @param  string  $database* @param  string  $prefix* @param  array  $config* @return \Illuminate\Database\Connection** @throws \InvalidArgumentException*/protected function createConnection($driver, $connection, $database, $prefix = '', array $config = []){if ($resolver = Connection::getResolver($driver)) {return $resolver($connection, $database, $prefix, $config);}switch ($driver) {case 'mysql':return new MySqlConnection($connection, $database, $prefix, $config);case 'pgsql':return new PostgresConnection($connection, $database, $prefix, $config);case 'sqlite':return new SQLiteConnection($connection, $database, $prefix, $config);case 'sqlsrv':return new SqlServerConnection($connection, $database, $prefix, $config);}throw new InvalidArgumentException("Unsupported driver [{$driver}].");}
}

设计模式之简单工厂模式(Simple Factory Pattern)相关推荐

  1. Net设计模式之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction)        简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实 ...

  2. Java设计模式之简单工厂模式(Simple Factory)

    [Java与模式]简单工厂模式(Simple Factory---吴义) 首先说明,Java与模式一系列的文章均是参考阎宏博士的<Java与模式>一书,加上自身的一些体会的探索,产生如下文 ...

  3. 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结

    4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了" ...

  4. 从零开始学设计模式(四):工厂模式(Factory Pattern)

    作者平台: | CSDN:blog.csdn.net/qq\_4115394- | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- ...

  5. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  6. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  7. 设计模式之简单工厂模式(Simply Factory)摘录

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种 ...

  8. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  9. 设计模式剖析——抽象工厂模式Abstract Factory Pattern

    含义 与工厂方法模式相比,概念有些不一样.有抽象零件.抽象产品.抽象工厂.用零件来组装出产品,组装出的产品才是完整的产品. 既然一个完整产品需要多个零件,那么每种具体工厂自然也需要可以同时生产出多种零 ...

  10. 一起学习设计模式--02.简单工厂模式

    工厂模式是最常用的一类创建型设计模式.我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式. 简单工厂模式是工厂方法模式的小弟,它不属于GoF 23种设计模式,但是在软件开发中应用也颇为频 ...

最新文章

  1. ipmsg 绑定tcp错误
  2. xp系统怎么连接云服务器,xp系统怎么连接云服务器
  3. LiveQing视频流媒体开放平台利用 webpack 打包压缩后端代码
  4. .NET开发人员必知的八个网站
  5. 获取列表中最大N个数的索引
  6. ThreadPoolExecutor 八种拒绝策略,对的,不是4种!
  7. c++提供的可有效分配对象空间的运算符是_Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
  8. MQTT与函数计算做热力图实践
  9. 如何使用Kubernetes的configmap通过环境变量注入到pod里
  10. 【TencentOS tiny】深度源码分析(4)——消息队列
  11. 2021年,作为算法工程师的你们会在CV业务上用Transformer吗?
  12. 教你如何拒绝带病毒的恶意网页陷阱
  13. 拓端tecdat|R语言HAR和HEAVY模型分析高频金融数据波动率
  14. mysql order by if函数_mysql order by
  15. bbs.FISHC.com//python_文件
  16. java PDF添加水印效果
  17. Carsim应用:LKA车道保持辅助系统(LQR控制器模型)
  18. STM32F103_study66_The punctual atoms(STM32 Temperature sensor experiment)
  19. Android系统(手机平板)根目录详解
  20. 统计学:描述性统计分析

热门文章

  1. Ubuntu文件系统根目录磁盘空间不足
  2. 8k,4k,2k视频时序参数分享
  3. C语言中打开一个应用程序可以调用或运行命令
  4. 9.7 StringTokenizer类
  5. 怎么快速修改EDIUS中的模板
  6. 3D单目目标检测从入门到做自己的Tesla
  7. Python+Selenium简单实现Web自动化测试
  8. 20、Gateway 过滤器
  9. MapReduce编程 -词频统计
  10. 刺激战场S6新赛季灵敏度终于来啦:最强教程手把手教你调