目录

  • 定义
  • 缺点
  • 代码示例
  • 消除分支语句

极客时间《设计模式》(王争)
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项目

我和王争学设计模式|工厂方法相关推荐

  1. 设计模式 工厂方法_工厂方法设计模式

    设计模式 工厂方法 工厂方法模式是流行的创作设计模式之一. 它并不特别依赖于工厂对象来创建对象. 而是要在同一类中使用单独的方法来创建对象. Factory Method模式定义了一个用于创建对象的接 ...

  2. 设计模式 工厂方法_工厂设计模式–一种有效的方法

    设计模式 工厂方法 如您所知,"工厂方法模式"或俗称"工厂设计模式"是"创意设计模式"类别下的一种设计模式. 模式背后的基本原理是,在运行时 ...

  3. 设计模式 工厂方法_使用工厂方法模式设计最佳实践

    设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...

  4. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. 我和王争学设计模式|抽象工厂

    目录 定义 标准框架 产品抽象和实现 工厂抽象和实现 调用工厂制造产品 运行结果 课程中示例改写 参考 极客时间<设计模式>(王争) 定义 提供一个创建一系列相关或相互依赖对象的接口,而无 ...

  7. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  8. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  9. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  10. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

最新文章

  1. OS / 总线锁和缓存一致性
  2. LeetCode之Weekly Contest 90
  3. pythondjango搭建数据管理平台,使用Django快速搭建简单的数据管理后台
  4. 老九java线上,老九 - SegmentFault 思否
  5. python获取重定向url_python中检测url重定向到的地址的例子
  6. NS2相关学习——创建Xgraph的输出文件
  7. strcpy用于调用的参数太少_C和汇编如何互相调用?嵌入式工程师必须掌握
  8. android 480p分辨率,[RK3399][Android7.1] HDMI显示屏(副屏)调试记录小结
  9. 让一个元素水平垂直居中的方法
  10. 学习OpenCV——OpenMP
  11. Mysql数据表关系与关联查询
  12. OSChina 周一乱弹 ——为什么非洲人短跑长跑都强
  13. pppoe按需连接服务器无响应,pppoe服务器无响应怎么解决_pppoe拨号失败怎么办
  14. Android基础篇-四大组件之使用ContentProvider实现数据共享
  15. STM32学习笔记(5) 串口通讯-接收与发送
  16. 巴西棕榈蜡的提取方式
  17. 经纬度转高斯坐标 java_经纬度坐标与高斯坐标的转换代码
  18. string和字符数组的reverse函数
  19. 写给我的如风老男人(终结版)
  20. Python 列表数据类型(list)[学习 Python 必备基础知识][看此一篇就够了]

热门文章

  1. android auto 映射百度地图,GitHub - puderty/pudev: 1,百度CarLife映射与高清修改,纯属自用。2,Android Auto的第三方地图...
  2. 【避坑指“难”】微信小程序自定义相机:自定义取景框、本地保存照片可分享、获取GPS定位
  3. 面向对象编程 - 六大原则
  4. 远光软件荣获 6 项珠海软件行业大奖
  5. 根据 cadence 设计图学习硬件知识 day02 了解飞腾 X100芯片
  6. Spark报错:ERROR shuffle.RetryingBlockFetcher: Exception while beginning fetch of 1 outstanding blocks
  7. 2019企鹅号自媒体阅读量怎么计算收益
  8. 计算机考研211一般考多少分,考研211一般考多少分
  9. Android 网卡修改
  10. linux中hda和sda的区别