设计模式之扩展- 论抽象工厂与工厂方法模式的不同

前情提要

由于这几天一直在写关于工厂模式的文章,发现了一个问题,不大不小。在工厂方法模式抽象工厂模式之间,似乎它俩之间的差别不是太大。所以特意开一篇文章讲讲它俩的区别。

产品维度

工厂方法模式:只围绕着一类接口来进行对象的创建与使用,使用场景单一和简单
抽象工厂模式:提供了一个用于创建相关或相关对象族的接口。

UML类图

工厂方法模式
抽象工厂模式

从UML类图 我们可以看到两种模式对应的抽象类型也是不一样的。工厂方法模式围绕着射击来进行对象的创建,而抽象模式则围绕 子弹 弹夹 瞄准镜 创建对应的工厂生成相关的对象族。

实现上的分别

比如我们对某些配置的解析;
针对规则配置的解析器:RuleConfigParser
JsonRuleConfigParser
XmlRuleConfigParser
YamlRuleConfigParser

针对系统配置的解析器:基于接口 SystemConfigParser
JsonSystemConfigParser
XmlSystemConfigParser
YamlSystemConfigParser

针对上面这种情景,如果继续使用工厂方法来实现的话,我们就可能需要编写8个工厂类,
因为一个parser就要编写一个工厂类了。而且对于维护的话 也是不太好的。
这时我们就可以采用抽象工厂模式了,可以让一个工厂负责创建多个不同类型的对象,而不是
只创建一种parser对象。我们来看看具体代码如何实现:
interface ConfigParserFactory
{
    public function createRuleParser();
    public function createSystemParser();
}

class JsonConfigParserFactory implements ConfigParserFactory
{
    public function createRuleParser()
    {
        return new JsonRuleConfigParser();
    }

    public function createSystemParser()
    {
        return new JsonSystemParser();
    }
}

class XmlConfigParserFactory implements ConfigParserFactory
{
    public function createRuleParser()
    {
        return new XmlRuleConfigParser();
    }

    public function createSystemParser()
    {
        return new XmlSystemParser();
    }
}

总结

工厂方法模式只有一个维度 产品和工厂是完全对应的。具体到实现类。
抽象工厂模式两个维度,工厂与产品两个维度,其中一个是从产品派生出来的。系统配置,规则配置这些产品类别的划分。另一个维度是从工厂派生出来的,有不同配置的工厂。
工厂模式对于只需要 json规则配置的工厂就已经足够了,但是存在一部分工厂不单单只需要json规则配置,他还要json系统配置等,所以更进一步抽象出抽象工厂。

希望各位能提出自己宝贵的建议,与诸君共同成长。!!十分感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值