ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

我和王争学设计模式|工厂方法

2021-09-09 18:30:29  阅读:169  来源: 互联网

标签:function return ruleConfigFilePath parser parserFactory 工厂 configText 设计模式 王争学


目录

极客时间《设计模式》(王争)
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";
    }
}
<?php

namespace 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项目

标签:function,return,ruleConfigFilePath,parser,parserFactory,工厂,configText,设计模式,王争学
来源: https://blog.csdn.net/hl449006540/article/details/120193736

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有