Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java设计模式学习记录-抽象工厂模式

Java设计模式学习记录-抽象工厂模式

作者头像
纪莫
发布于 2018-07-04 10:07:48
发布于 2018-07-04 10:07:48
43400
代码可运行
举报
文章被收录于专栏:JimoerJimoer
运行总次数:0
代码可运行

前言

上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上。

抽象工厂模式

抽象工厂模式是围绕着一个超级工厂创建其他工厂。这个超级工厂被称为其他工厂的工厂,主要是为了解决接口选择问题。

举例说明:

还是继续上篇用户使用手的例子,现在生产手机的工厂发现,不同的手机使用的配件也不相同,需要单独的生产配件。例如iphonX使用的原深感摄像头,以及OLED显示屏,而iphone8使用的全新感光元件组成的摄像头,以及视网膜高清显示屏。这样就需要通过每个配件的配件工厂来提供相应的配件。为了在写代码实例时取名称简单,暂且定义iphoneX使用的是A摄像头和A显示器,而iphone8使用的是B摄像头和B感应器。

代码实例如下:

显示器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 显示屏接口
 */
public interface Display {
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * iphoneX显示器
 */
public class ADisplay implements Display {

    public ADisplay(){
        System.out.println("##### 制造OLED显示屏 #####");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * iphone8显示器
 */
public class BDisplay implements Display {

    public BDisplay(){
        System.out.println("##### 制造高清视网膜显示器 #####");
    }
}

摄像头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 摄像头接口
 */
public interface Camera {
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * iphoneX摄像头
 */
public class ACamera implements Camera {

    public ACamera(){
        System.out.println("##### 制造原深感摄像头 #####");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * iphone8摄像头
 */
public class BCamera implements Camera{
    public BCamera(){
        System.out.println("#####  制造搭配全新感光组件的摄像头 #####");
    }
}

工厂类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 抽象工厂类
 */
public abstract class AbstractFactory {
    /**
     * 获得显示屏
     * @return
     */
    public abstract Display getDisplay();

    /**
     * 获得摄像头
     * @return
     */
    public abstract Camera getCamera();

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * iphoneX配件工厂类
 */
public class IphoneXPartsFactory extends AbstractFactory{
    /**
     * 获得显示屏
     *
     * @return
     */
    @Override
    public Display getDisplay() {
        return new ADisplay();
    }

    /**
     * 获得摄像头
     *
     * @return
     */
    @Override
    public Camera getCamera() {
        return new ACamera();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * iphone8配件工厂类
 */
public class Iphone8PartsFactory extends AbstractFactory{
    /**
     * 获得显示屏
     *
     * @return
     */
    @Override
    public Display getDisplay() {
        return new BDisplay();
    }

    /**
     * 获得摄像头
     *
     * @return
     */
    @Override
    public Camera getCamera() {
        return new BCamera();
    }
}

用户类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 用户类
 */
public class Customer {
    
    /**
     * 制造配件
     * @param af
     */
    public static void madeIphone(AbstractFactory af){
        //制造iphone的配件
        af.getDisplay();
        af.getCamera();
    }

    public static void main(String[] args) {

        AbstractFactory  iphonePartsFactory = new IphoneXPartsFactory();
        //制造iPhoneX 的配件
        madeIphone(iphonePartsFactory);

        iphonePartsFactory = new Iphone8PartsFactory();
        //制造iPhone8 的配件
        madeIphone(iphonePartsFactory);

    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##### 制造OLED显示屏 #####
##### 制造原深感摄像头 #####
##### 制造高清视网膜显示器 #####
#####  制造搭配全新感光组件的摄像头 #####

工厂模式也是属于创建模式,它是工厂方法模式的进一步推广。在当一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和黄金这些产品对象的责任分割开来,这个时候就可以使用抽象工厂模式了。这样在使用产品的一方不要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。

工厂模式的关系类图如下:

抽象工厂模式中的角色和工厂方法模式中的角色是一样的,这里就不介绍了,可以看上一篇工厂方法模式的角色介绍。

抽象工厂模式的优点和缺点

优点:

分离接口和实现

客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向川普的接口编程而已。也就是说,客户端从具体的产品实现中解耦出来了。

使切换产品族变得容易

因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从iphoneX的配件到iphone8的配件只需要切换一下具体工厂。

缺点:

抽象工厂模式的缺点是不太容易扩展新的产品。如果需要给整个产品族添加一个新的产品,那么久需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA设计模式之抽象工厂模式
前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例。
秃头哥编程
2019/06/05
4150
JAVA设计模式之抽象工厂模式
设计模式(三):抽象工厂模式
设计模式(三):抽象工厂模式
Java架构师必看
2021/05/14
2740
Java设计模式学习记录-简单工厂模式、工厂方法模式
之前介绍了设计模式的原则和分类等概述。今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍。
纪莫
2018/07/24
2570
Java设计模式学习记录-简单工厂模式、工厂方法模式
结合案例深入解析:抽象工厂模式
每一个模式都是针对一定问题的解决方案。抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
李红
2019/06/24
2960
结合案例深入解析:抽象工厂模式
设计模式之抽象工厂模式(创建型)
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
SmileNicky
2019/01/17
2870
设计模式-抽象工厂模式
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。我们可以想一下,有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象,即产品族。 这个时候我们就需要使用抽象工厂模式。 在讲解抽象工厂模式之前,我们需要介绍两个概念: 产品等级结构:产品的继承结构。 产品族:在抽象工厂模式中,产品族(Dough、Sauce)是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。 模式定义 提供一个
武培轩
2018/04/18
7400
设计模式-抽象工厂模式
设计模式—— 九 :抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下:
三分恶
2020/07/16
3070
和 lvgo 一起学设计模式(三)创建型之抽象工厂模式
特别强调了一下抽象工厂模式的概念理解部分我觉得是非常有必要的,当然我在写下这篇文章之前看过很多优秀的博文、书籍、视频等资料对抽象工厂模式的讲解和代码示例等内容,但我发现。抽象工厂的概念被一次又一次的刷新,所以我也想表达一下自己对抽象工厂的理解。如果你和我持不同的意见,可以继续往下看,我很愿意和你一起讨论这个问题。
星尘的一个朋友
2020/11/25
3530
和 lvgo 一起学设计模式(三)创建型之抽象工厂模式
创建型设计模式(4)—— 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象类接口,而无需指定它们的具体类。 产品族的定义是:某个具体工厂生产所有类型的产品,比如定义了一个抽象工厂接口 A,它可以生产三种产品:p1、p2、p3,而这三个产品就叫一个产品族。
恋喵大鲤鱼
2024/05/24
1050
创建型设计模式(4)—— 抽象工厂模式(Abstract Factory Pattern)
设计模式的征途—4.抽象工厂(Abstract Factory)模式
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销。那么,我们应该怎么来重构?似乎,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是本次将要学习的抽象工厂模式的基本思想。
Edison Zhou
2018/08/20
3610
设计模式的征途—4.抽象工厂(Abstract Factory)模式
Java常用设计模式--三种工厂模式之抽象工厂模式(Abstract Factory Pattern)
抽象工厂是生产创建一组相关或者相互依赖的产品对象,这些产品对象必须相互是有关系或有依赖的,而工厂方法中的工厂是生产单一产品对象的工厂。
gang_luo
2020/08/13
3220
设计模式 | 抽象工厂模式及典型应用
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
小旋锋
2019/01/21
9130
设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。
Dylan Liu
2019/08/07
3630
设计模式(十三)抽象工厂模式
前言 此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式。关于这两个模式,不明白的可以查看我的博客:http://liuwangshu.cn。 抽象工厂模式定义 抽象工厂模式可以说是是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。那什么是多个产品线呢?拿我们在简单工厂模式以及工厂方法模式中学习的生产电脑的例子来举例,我们一直都是生产联想和惠普的电脑,但是电脑也有多个产品线:台式机、笔记本和平板等等,联想和惠普都在生产这些不同产
用户1269200
2018/02/01
7310
设计模式(十三)抽象工厂模式
设计模式3之抽象工厂模式
然而现实生活中有很多综合型的工厂,比如有些电视工厂不仅生产电视机,还会生产与之配套的机顶盒。
Lvshen
2022/05/05
2470
设计模式3之抽象工厂模式
一起学习设计模式--04.抽象工厂模式
在工厂方法模式中通过引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题。但是由于工厂方法模式中每个工厂只生产一类产品,这样可能会导致系统中存在大量的工厂类,势必会增加系统的开销。
独立观察员
2022/12/06
4060
一起学习设计模式--04.抽象工厂模式
go设计模式之抽象工厂模式
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产
melodyshu
2024/04/26
1291
Java设计模式(二)之创建型模式:抽象工厂模式
随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机。
全栈程序员站长
2021/04/09
3340
Java设计模式(二)之创建型模式:抽象工厂模式
[设计模式]之十三:抽象工厂模式
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
wOw
2018/09/18
2800
[设计模式]之十三:抽象工厂模式
【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
假设现在有一个车辆制造工厂,它生产两种车,A类车和B类车,每类车有其各自的车门和轮子,这就需要不同的车间来做,A类车的车间有生产车门的工作,有生产轮子的工作,B类车的车间有生产车门的工作,有生产轮子的工作,我们需要哪类车的部件时,就去哪个车间拿,拿的过程(相同的操作,抽取出来一个抽象工厂类,这里的拿就是指方法)是一样的。
爱笑的架构师
2020/09/24
2630
【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
推荐阅读
相关推荐
JAVA设计模式之抽象工厂模式
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验