前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微服务[学成在线] day03:CMS页面管理开发
使用 CmsPageRepository 中的 findAll(Example<S> var1, Pageable var2) 方法实现,无需定义。
LCyee
2020/08/05
2.3K0
微服务[学成在线] day03:CMS页面管理开发
微服务[学成在线] day14:媒资管理
原始视频通常需要经过编码处理,生成 m3u8 和 ts 文件方可基于 HLS 协议播放视频。通常用户上传原始视频,系统自动处理成标准格式,系统对用户上传的视频自动编码、转换,最终生成m3u8 文件和 ts 文件,处理流程如下:
LCyee
2020/08/05
1.3K0
微服务[学成在线] day14:媒资管理
微服务[学成在线] day01:CMS接口开发
由于在学习该项目的过程中发现了原讲义存在的一些问题,所以该笔记基于「学成在线」微服务项目 PDF 讲义进行编写,并且投入了时间去优化了笔记的格式、代码的高亮、重点的标记等。
LCyee
2020/08/05
1.1K0
微服务[学成在线] day01:CMS接口开发
前端成神之路-vue前端工程化
小结:推荐使用ES6模块化,因为AMD,CMD局限使用与浏览器端,而CommonJS在服务器端使用。 ES6模块化是浏览器端和服务器端通用的规范.
海仔
2021/03/20
8550
谷粒学院day5 讲师管理模块的前端实现
前端页面登录的url经常会挂掉,要改为本地地址。启动前端的demo项目。浏览器右键选择inspect打开调试界面,切到Network,点击Login,具体操作参考下图。
半旧518
2022/10/26
4.6K0
谷粒学院day5 讲师管理模块的前端实现
微服务[学成在线] day06:页面发布以及课程管理
3、每个站点服务部署 cms client 程序,并与交换机绑定,绑定时指定站点Id为routingKey。
LCyee
2020/08/05
1.4K0
微服务[学成在线] day06:页面发布以及课程管理
微服务[学成在线] day20:项目总结
由于在学习该项目的过程中发现了原讲义存在的一些问题,所以该笔记基于「学成在线」微服务项目 PDF 讲义进行编写,并且投入了时间去优化了笔记的格式、代码的高亮、重点的标记等。
LCyee
2020/08/06
2.4K0
微服务[学成在线] day20:项目总结
webpack
webpack是一个现代JavasScript应用程序的模块打包器(module bunder) 官方网站https://www.webpackjs.com/
羊羽shine
2019/06/16
1.4K0
微服务[学成在线] day04:页面静态化
? 知识点概览 为了方便后续回顾该项目时能够清晰的知道本章节讲了哪些内容,并且能够从该章节的笔记中得到一些帮助,所以在完成本章节的学习后在此对本章节所涉及到的知识点进行总结概述。 本章节为【学成
LCyee
2020/08/05
2K0
微服务[学成在线] day04:页面静态化
07 . 前端工程化(ES6模块化和webpack打包,配置Vue组件加载器和发布项目)
推荐使用ES6模块化,因为AMD,CMD局限使用与浏览器端,而CommonJS在服务器端使用。 ES6模块化是浏览器端和服务器端通用的规范.
iginkgo18
2020/11/24
2.6K0
07 . 前端工程化(ES6模块化和webpack打包,配置Vue组件加载器和发布项目)
微服务[学成在线] day07:课程管理开发
课程添加完成后可通过我的课程进入课程修改页面,此页面显示我的课程列表,如下图所示,可分页查询。
LCyee
2020/08/05
7710
微服务[学成在线] day07:课程管理开发
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面) @(HTML/JS) 一般来说,使用vue做成单页应用比较好,但特殊情况下,需要使用多页面也有另外的好处。例如手Q的多webview架构,新开页面有利于ios右划返回,也避免了返回时页面的刷新。 所以,这里我们探讨一下如何配置实现多页面的项目框架。这里是开篇,先以最简单的纯前端多页面为例入手,最终目标是完成Node.js多页面直出+前后端同构的架构。 本文源代码:https://github.com/ke
用户1258909
2018/07/03
1.4K0
SSM 单体框架 - 前端开发:课程和广告模块
使用 Element UI 表格进行数据展示:https://element.eleme.cn/#/zh-CN/component/table
RendaZhang
2020/10/09
1.3K0
SSM 单体框架 - 前端开发:课程和广告模块
10天从入门到精通Vue(五)Webpack打包
webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
共饮一杯无
2022/11/28
4960
10天从入门到精通Vue(五)Webpack打包
Vue 07.webpack
webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
LittlePanger
2020/04/14
7940
一步一步创建vue2.0项目(一)
新建一个文件夹 vue2.0-learn 。_前提是默认已经安装了nodejs和npm_
frontoldman
2019/09/02
6460
59.Vue 使用webpack构建vue项目
在前面的篇章中,已经说明了 webpack4 的基本使用,那么本章节开始在 webpack4 中构建vue项目,同时对比看看这种构建方式,与在网页script导入 vue.js 中的区别。
Devops海洋的渔夫
2020/08/20
2.7K0
59.Vue 使用webpack构建vue项目
前端基础知识总结
注意:这个组件的创建无需在页面中书写任何标签,是一个js插件,在需要展示消息提示的位置直接调用提供的js插件方法即可。
栖西
2023/10/17
1.2K0
教育平台项目前端:Vue.js 高级
Vue cli 是基于 Vue 的应用开发提供的一个标准的脚手架工具,为应用搭建基础的框架结构,提供插件、开发服务、Preset、构建打包功能。
RendaZhang
2020/09/08
3.2K0
2022-webpack5实战教程
打包成功之后,查看dist目录下的index.html文件是否引用了打包之后的js
gogo2027
2022/10/17
8910
相关推荐
微服务[学成在线] day03:CMS页面管理开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文