前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工厂模式和抽象工厂的区别是什么?

工厂模式和抽象工厂的区别是什么?

作者头像
Single
发布2021-04-20 10:57:13
3440
发布2021-04-20 10:57:13
举报

简单工厂说白了就是一个超级工厂,他可以生产各种各样的产品,产品之间无关联,比如:

代码语言:javascript
复制
public interface SimpleFactory {

    //生产一个冰箱
    Refrigerator createRefiger();

    //生产一个空调
    AirConditioning createAirConditioning();

    //生产一个 TV
    TV createTV();
}

一般也会有一个默认的实现:

代码语言:javascript
复制
public class DefaultSimpleFactory implements SimpleFactory{

    @Override
    public Refrigerator createRefiger() {
        return new Refrigerator();
    }

    @Override
    public AirConditioning createAirConditioning() {
        return new AirConditioning();
    }

    @Override
    public TV createTV() {
        return new TV();
    }
}

这就是一个简单工厂模式,非常的简单,还没有很强的抽象性。

Spring 的 BeanFactory 其实就是一个简单工厂模式,他定义了一个 BeanFactory 工厂,然后会有 DefaultListableBeanFactory 去实现这个工厂声明的所有能力。

工厂方法模式

其实理论上来说,可以把简单工厂模式理解为工厂方法模式的一种特例,将他的那个超级大工厂拆分成多个工厂就是工厂方法模式了。

同样有一个抽象接口表述一个工厂:

代码语言:javascript
复制
public interface MethodFactory {

    //生产一个冰箱
    Refrigerator createRefiger();

    //生产一个空调
    AirConditioning createAirConditioning();

    //生产一个 TV
    TV createTV();
}

简单工厂是用一个 DefaultFactory 完成了工厂所有的能力要求。但是现在我们的厂家变多了,有格力冰箱、海尔冰箱、海信冰箱等等,他们生产的冰箱或空调都不一样,如果用简单工厂的话,就需要做区分,增加更多的方法,生产格力冰箱的,生产海尔冰箱的,非常的丑陋。

工厂方法模式,需要区分不同的工厂,这里我们创建格力工厂、海尔工厂和海信工厂。

代码语言:javascript
复制
public class GeliFactory implements MethodFactory {

    @Override
    public Refrigerator createRefiger() {
        return new GeliRefrigerator();
    }

    @Override
    public AirConditioning createAirConditioning() {
        return new GeliAirConditioning();
    }

    @Override
    public TV createTV() {
        return new GeliTV();
    }
}

格力工厂返回的是格力的空调、格力的冰箱以及格力的电视机,海尔和海信也都会返回他们自己品牌的产品,这里就不贴他们的代码了,类似。

这样,我们的工厂方法对外提供了生产产品的能力,具体产生何种类型的产品,将由具体的工厂决定。这就是工厂方法模式,相信大部分人应该都不陌生。

Logpack 中就有一个典型的工厂方法,工厂抽象类 ILoggerFactory:

代码语言:javascript
复制
public interface ILoggerFactory {
    Logger getLogger(String var1);
}

他有两个具体的工厂实现这个 getLogger 方法,

代码语言:javascript
复制
public class NOPLoggerFactory implements ILoggerFactory {
    public NOPLoggerFactory() {
    }

    public Logger getLogger(String name) {
        return NOPLogger.NOP_LOGGER;
    }
}
代码语言:javascript
复制
public class SubstituteLoggerFactory 
            implements ILoggerFactory {
    //省略
    public synchronized Logger getLogger(String name) {
        SubstituteLogger logger = (SubstituteLogger)this.loggers.get(name);
        if (logger == null) {
            logger = new SubstituteLogger(name, this.eventQueue, this.postInitialization);
            this.loggers.put(name, logger);
        }

        return logger;
    }//省略。。。。。
}

抽象工厂模式

抽象工厂模式可能不如前两者常见,但是确是为了补充前两者的,有特定的场景。

想象这么一种情况,你使用了工厂方法模式,你的工厂提供的能力非常多,可以生产冰箱、电视、空调、洗衣机、电脑以及桌子等等,这样你就会产生很多的工厂。

抽象工厂的作用就是在一定前提下,帮你分类这些工厂,比如按品牌分类,或者按照价格等级分类,这样会大大缩减系统中的工厂数量。

这个前提就是你的这些工厂需要在两个维度上具备共性:

image
image

专业术语就是『产品等级』和『产品族』两个概念,说人话就是,这些工厂需要至少具有两个共性,比如都可以按照类型区分成三类,电视机、冰箱和空调,也可以按照品牌区分成海尔、海信和 TCL。

这样他们就具备抽象工厂的前提条件,你可以按照产品族合并工厂,正如我上面使用到的例子一样,工厂对外提供生产电视、冰箱和空调三种能力,而系统按品牌存在三个工厂,所以从准确来说,我在工厂方法中使用的例子其实也是加强版的抽象工厂模式。

代码例子就不举例了,抽象工厂其实就是帮助减少系统的工厂数量的,但前提条件就是这些工厂要具备两个及以上的共性

希望你被面试官问道工厂方法和抽象工厂的区别的时候,能想起这一句话。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工厂方法模式
  • 抽象工厂模式
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档