我和王争学设计模式|工厂方法
目录
- 定义
- 缺点
- 代码示例
- 消除分支语句
极客时间《设计模式》(王争)
Github Gitee
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method
使一个类的实例化延迟到子类。
缺点
- 类的数量会随着扩展爆炸性增长,如果增加一个类,要同时增加工厂类(
Factory
)和产品类(Product
) - 并没有完全消除“
else-if
”语句,如果要消除就利用多态。
代码示例
还是以之前的简单工厂为例,进行重构,列出部分代码,完整代码在上方链接中。
<?php
namespace App;interface IRuleConfigParser
{public function parser($configText);
}
<?php
namespace App;class JsonRuleConfigParser implements IRuleConfigParser
{public function parser($configText){return "json";}
}
<?phpnamespace App;interface IRuleConfigParserFactory
{public function createParser();
}
<?php
namespace App;class JsonRuleConfigParser implements IRuleConfigParser
{public function parser($configText){return "json";}
}
<?php
namespace App;class RuleConfigSource
{protected $ruleConfig;public function load( $ruleConfigFilePath){$ruleConfigFileExtension = $this->getFileExtension($ruleConfigFilePath);$parserFactory = null;if( strcasecmp($ruleConfigFileExtension,"json" )===0){$parserFactory = new JsonRuleConfigParserFactory();} else if ( strcasecmp($ruleConfigFileExtension,"xml" )===0){$parserFactory = new XmlRuleConfigParserFactory();} else if( strcasecmp($ruleConfigFileExtension,"yaml" )===0){$parserFactory = new YamlRuleConfigParserFactory();} else {//default}$parser = $parserFactory->createParser();$configText = "";$this->ruleConfig = $parser->parser($configText);return $this->ruleConfig;}/*** 解析文件扩展名* @param $ruleConfigFilePath* @return mixed*/private function getFileExtension($ruleConfigFilePath){//for example$pathSplit = explode('.',$ruleConfigFilePath);return $pathSplit[count($pathSplit)-1] ;}}
<?php
/*** Created by PhpStorm.* User: 小水* Date: 2021-07-28* Time: 11:50*/use App\RuleConfigSource;require __DIR__.'/vendor/autoload.php';$obj = new RuleConfigSource();$config = $obj->load('a.json');
print($config. PHP_EOL);
消除分支语句
把上面分支语句部分替换为一个简单工厂,工厂使用查表法实现。
<?php
/*** Created by PhpStorm.* User: icemoon* Date: 2021-09-09* Time: 14:53*/namespace App;class RuleConfigParserFactoryMap
{private static $cachedFactories;private static function init(){self::$cachedFactories = ["json" => new JsonRuleConfigParserFactory(),"xml" => new XmlRuleConfigParserFactory(),"yaml" => new YamlRuleConfigParserFactory(),];}public static function getParserFactory($type){self::init();if ($type == null ) {return null;}$parserFactory = self::$cachedFactories[$type];return $parserFactory;}
}
然后修改RuleConfigSource
文件
<?php
namespace App;class RuleConfigSource
{protected $ruleConfig;public function load( $ruleConfigFilePath){$ruleConfigFileExtension = $this->getFileExtension($ruleConfigFilePath);//使用简单工厂再次重构$parserFactory = RuleConfigParserFactoryMap::getParserFactory($ruleConfigFileExtension);$parser = $parserFactory->createParser();$configText = "";$this->ruleConfig = $parser->parser($configText);return $this->ruleConfig;}/*** 解析文件扩展名* @param $ruleConfigFilePath* @return mixed*/private function getFileExtension($ruleConfigFilePath){//for example$pathSplit = explode('.',$ruleConfigFilePath);return $pathSplit[count($pathSplit)-1] ;}}
参考资料:
[1]. 极客时间《设计模式》(王争)
[2].《研磨设计模式》(陈臣、王斌)
[3]. 《Learning PHP设计模式》
[4]. 从零使用composer初始化PSR-4项目
我和王争学设计模式|工厂方法相关推荐
- 设计模式 工厂方法_工厂方法设计模式
设计模式 工厂方法 工厂方法模式是流行的创作设计模式之一. 它并不特别依赖于工厂对象来创建对象. 而是要在同一类中使用单独的方法来创建对象. Factory Method模式定义了一个用于创建对象的接 ...
- 设计模式 工厂方法_工厂设计模式–一种有效的方法
设计模式 工厂方法 如您所知,"工厂方法模式"或俗称"工厂设计模式"是"创意设计模式"类别下的一种设计模式. 模式背后的基本原理是,在运行时 ...
- 设计模式 工厂方法_使用工厂方法模式设计最佳实践
设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...
- 4. 星际争霸之php设计模式--工厂方法模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- java 工厂方法_java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...
- 我和王争学设计模式|抽象工厂
目录 定义 标准框架 产品抽象和实现 工厂抽象和实现 调用工厂制造产品 运行结果 课程中示例改写 参考 极客时间<设计模式>(王争) 定义 提供一个创建一系列相关或相互依赖对象的接口,而无 ...
- 设计模式 | 工厂方法模式及典型应用
工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...
- python工厂模式 django_python设计模式-工厂方法模式
题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...
- 工厂方法模式_1天1个设计模式——工厂方法模式
意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...
- [设计模式] ------ 工厂方法模式
工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...
最新文章
- OS / 总线锁和缓存一致性
- LeetCode之Weekly Contest 90
- pythondjango搭建数据管理平台,使用Django快速搭建简单的数据管理后台
- 老九java线上,老九 - SegmentFault 思否
- python获取重定向url_python中检测url重定向到的地址的例子
- NS2相关学习——创建Xgraph的输出文件
- strcpy用于调用的参数太少_C和汇编如何互相调用?嵌入式工程师必须掌握
- android 480p分辨率,[RK3399][Android7.1] HDMI显示屏(副屏)调试记录小结
- 让一个元素水平垂直居中的方法
- 学习OpenCV——OpenMP
- Mysql数据表关系与关联查询
- OSChina 周一乱弹 ——为什么非洲人短跑长跑都强
- pppoe按需连接服务器无响应,pppoe服务器无响应怎么解决_pppoe拨号失败怎么办
- Android基础篇-四大组件之使用ContentProvider实现数据共享
- STM32学习笔记(5) 串口通讯-接收与发送
- 巴西棕榈蜡的提取方式
- 经纬度转高斯坐标 java_经纬度坐标与高斯坐标的转换代码
- string和字符数组的reverse函数
- 写给我的如风老男人(终结版)
- Python 列表数据类型(list)[学习 Python 必备基础知识][看此一篇就够了]
热门文章
- android auto 映射百度地图,GitHub - puderty/pudev: 1,百度CarLife映射与高清修改,纯属自用。2,Android Auto的第三方地图...
- 【避坑指“难”】微信小程序自定义相机:自定义取景框、本地保存照片可分享、获取GPS定位
- 面向对象编程 - 六大原则
- 远光软件荣获 6 项珠海软件行业大奖
- 根据 cadence 设计图学习硬件知识 day02 了解飞腾 X100芯片
- Spark报错:ERROR shuffle.RetryingBlockFetcher: Exception while beginning fetch of 1 outstanding blocks
- 2019企鹅号自媒体阅读量怎么计算收益
- 计算机考研211一般考多少分,考研211一般考多少分
- Android 网卡修改
- linux中hda和sda的区别