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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
linux下10条查看系统和硬件信息的命
如果只想知道系统的名称,可以使用uname命令,而无需打印系统的相关的信息.或者使用uname -s命令将打印系统的内核名称.
小柒吃地瓜
2020/04/22
3K0
9个Linux 常用查看系统硬件信息命令(实例详解)
在Linux下,我们经常需要查看系统的硬件信息, 这里我罗列了查看系统硬件信息的实用命令,并做了分类,实例解说。
网络工程师笔记
2021/05/17
4.5K0
9个Linux 常用查看系统硬件信息命令(实例详解)
Linux下如何查看硬件信息?
我们在 Linux 下进行开发时,有时也需要知道当前的硬件信息,比如:CPU几核?使用情况?内存大小及使用情况?USB设备是否被识别?等等类似此类问题。下面良许介绍一些常用的硬件查看命令。
吾非同
2020/10/26
10.9K0
Linux下如何查看硬件信息?
lspci命令详解无网卡信息_linux系统安装图形化界面
说明: lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具。
全栈程序员站长
2022/09/30
4K0
Linux 性能调优之硬件资源监控
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/11/28
6670
Linux 性能调优之硬件资源监控
【Linux】《how linux work》第三章 设备
This chapter is a basic tour of the kernel-provided device infrastructure in a functioning Linux system.
阿东
2024/03/22
2560
【Linux】《how linux work》第三章 设备
系统硬件以及各类信息查看
描述:hwinfo 意即硬件信息工具,是另外一种很好的实用工具。它被用来检测系统中已存在的硬件,并且以可读的格式显示各种硬件组件的细节信息。 系统发行版安装 hwinfo:
全栈工程师修炼指南
2022/09/28
4K0
linux基础命令介绍十二:磁盘与文件系统
本篇讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬盘等辅助存储器中。硬盘一般容量较大,为了便于管理和使用,可以将硬盘分成一到多个逻辑磁盘,称为分区;为使分区中的文件组织成操作系统能够处理的形式,需要对分区进行格式化(创建文件系统);在linux中,对于格式化后的分区,还必须经过挂载(可简单理解为将分区关联至linux目录树中某个已知目录)之后才能使用。
用户5030870
2019/04/11
4.9K0
linux基础命令介绍十二:磁盘与文件系统
Linux下IP SAN共享存储操作记录
一、简单介绍 SAN,即存储区域网络(storage area network and SAN protocols),它是一种高速网络实现计算机与存储系统之间的数据传输。常见的分类是FC-SAN和IP-SAN两种。FC-SAN通过光纤通道协议转发scsi协议;IP-SAN通过TCP协议转发scsi协议,也就是IP 地址。存储设备是指一台或多台用以存储计算机数据的磁盘设备,通常指磁盘阵列,主要厂商EMC、日立等。 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在
洗尽了浮华
2018/03/28
6.6K0
Linux下IP SAN共享存储操作记录
Linux基础篇——Linux磁盘操作(磁盘基础知识、分类、分区、挂载、卸载、扩容)详解「建议收藏」
  假如你有个大木桶要装东西,如果木桶没有划分层,所有东西全部放入里面,虽然可以装,但是对大木桶的使用就合不合理,造成杂乱无章,寻找东西时候也耗时,甚至还有不同物品之间不能存放在一起而导致危险,那更好的做法自然是给大木桶画一下不同的区域,分成不同的层,每个层放不同的东西,即安全,寻找起来也方便;
全栈程序员站长
2022/09/01
8.1K0
Linux基础篇——Linux磁盘操作(磁盘基础知识、分类、分区、挂载、卸载、扩容)详解「建议收藏」
Linux多块物理磁盘做LVM
最近刚刚跳槽,新单位同事问了我个问题,突然把我问懵了,因为好久没有接触底层磁盘了,于是做了以下的实验。
Bob hadoop
2021/02/27
5.1K0
Linux多块物理磁盘做LVM
linux 存储设备
部署逻辑卷 部署时,需要逐个配置物理卷、卷组和逻辑卷,常用的部署命令如表7-3所示。
用户8006012
2022/10/25
12.3K0
Linux磁盘-MBR&GPT
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2024/11/01
1210
Linux磁盘-MBR&GPT
树莓派自建 NAS 云盘之——树莓派搭建网络存储盘
我将在接下来的这三篇文章中讲述如何搭建一个简便、实用的 NAS 云盘系统。我在这个中心化的存储系统中存储数据,并且让它每晚都会自动的备份增量数据。本系列文章将利用 NFS 文件系统将磁盘挂载到同一网络下的不同设备上,使用 Nextcloud 来离线访问数据、分享数据。
星哥玩云
2022/07/24
5.4K0
树莓派自建 NAS 云盘之——树莓派搭建网络存储盘
ceph块设备使用iscsi
Ceph 块设备(也叫RBD)服务提供了大小可调、精炼、支持快照和克隆的块设备。为提供高性能, Ceph 把块设备条带化到整个集群。 Ceph 同时支持内核对象( KO ) 和 QEMU 管理程序直接使用 librbd ——避免了内核对象在虚拟系统上的开销。
summerking
2023/04/27
1.3K0
Ceph的磁盘管理tips
换盘的时候一定要验明正身,原生的ceph-disk方式对磁盘分区的信息标记实在是太粗糙,很容易看花眼,比如下面这个例子,虽然通过PARTLABEL可以区分journal或者data分区,但是很难搞清楚Journal和Data分区具体对应哪个OSD
用户1260683
2018/07/31
1.5K0
Linux磁盘管理之LVM快速入门配置
描述:LVM——Logical Volume Manager就是动态卷管理在Linux2.4内核以上实现的磁盘管理技术,它可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。
全栈工程师修炼指南
2020/10/26
3.1K0
Linux磁盘管理之LVM快速入门配置
新增存储用Parted分区并建LVM卷
Welcome to GNU Parted! Type 'help' to view a list of commands.
三杯水Plus
2018/11/14
2.5K0
【香菇带你学Linux】Linux系统中磁盘管理LVM与挂载
本文以属于Linux系统基本概念,如果以查找教程教程,解决问题为主,只需要查看本文后半部分。如需要系统性学习请查看本文前半部分。
炒香菇的书呆子
2024/07/22
1.2K0
Linux软RAID下线后恢复
机器中有数据的话,操作起来必须要非常小心。内部samba服务器访问不了,到了/share(共享目录)下,什么也没有。数据全部都没看到。后来,仔细查看,发现机器有5块硬盘,好像是做了软raid
星哥玩云
2022/06/30
4.6K0
推荐阅读
相关推荐
linux下10条查看系统和硬件信息的命
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文