前言

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

抽象工厂模式

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

举例说明:

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

代码实例如下:

显示器

/**
* 显示屏接口
*/
public interface Display {
}
/**
* iphoneX显示器
*/
public class ADisplay implements Display { public ADisplay(){
System.out.println("##### 制造OLED显示屏 #####");
}
}
/**
* iphone8显示器
*/
public class BDisplay implements Display { public BDisplay(){
System.out.println("##### 制造高清视网膜显示器 #####");
}
}

摄像头

/**
* 摄像头接口
*/
public interface Camera {
}
/**
* iphoneX摄像头
*/
public class ACamera implements Camera { public ACamera(){
System.out.println("##### 制造原深感摄像头 #####");
}
}
/**
* iphone8摄像头
*/
public class BCamera implements Camera{
public BCamera(){
System.out.println("##### 制造搭配全新感光组件的摄像头 #####");
}
}

工厂类

/**
* 抽象工厂类
*/
public abstract class AbstractFactory {
/**
* 获得显示屏
* @return
*/
public abstract Display getDisplay(); /**
* 获得摄像头
* @return
*/
public abstract Camera getCamera(); }
/**
* iphoneX配件工厂类
*/
public class IphoneXPartsFactory extends AbstractFactory{
/**
* 获得显示屏
*
* @return
*/
@Override
public Display getDisplay() {
return new ADisplay();
} /**
* 获得摄像头
*
* @return
*/
@Override
public Camera getCamera() {
return new ACamera();
}
}
/**
* iphone8配件工厂类
*/
public class Iphone8PartsFactory extends AbstractFactory{
/**
* 获得显示屏
*
* @return
*/
@Override
public Display getDisplay() {
return new BDisplay();
} /**
* 获得摄像头
*
* @return
*/
@Override
public Camera getCamera() {
return new BCamera();
}
}

用户类

/**
* 用户类
*/
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); }
}

运行结果:

##### 制造OLED显示屏 #####
##### 制造原深感摄像头 #####
##### 制造高清视网膜显示器 #####
##### 制造搭配全新感光组件的摄像头 #####

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

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

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

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

优点:

分离接口和实现

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

使切换产品族变得容易

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

缺点:

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

Java设计模式学习记录-抽象工厂模式的更多相关文章

  1. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  2. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  3. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  4. 《Java设计模式》之抽象工厂模式

    场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...

  5. 《JAVA设计模式》之抽象工厂模式(Abstract Factory)

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  6. 设计模式学习心得<抽象工厂模式 Abstract Factory>

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  7. 【java设计模式】-03抽象工厂模式

    抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ...

  8. java设计模式之二抽象工厂模式(Abstract Factory)

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

  9. java设计模式-----3、抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创 ...

随机推荐

  1. D3_book 11.2 stack

    <!-- book :interactive data visualization for the web 11.2 stack 一个堆叠图的例子 --> <!DOCTYPE htm ...

  2. jQuery插件初级练习4

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. jQuery插件初级练习1答案

    html: <script> $(".btn").click(function(){ $.color($("#box"),"blue&qu ...

  4. STF环境搭建(ubuntu)

    一,环境搭建 1. linux 一些基础的工具要有: sudo apt-get update sudo apt-get install git sudo apt-get install lib32st ...

  5. WPF---DataGrid设置列的百分比宽度 & 列值显示格式化

    <DataGrid Height="Auto" Width="Auto"> <DataGrid.Columns> <DataGri ...

  6. linux 的计划任务 定时任务

    linux的计划任务,也叫做定时任务 https://www.cnblogs.com/mingforyou/p/3930636.html 名字是crond 查看linux本机的定时任务 crontab ...

  7. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. 【友情链接】各位dalao的博客

    同省神犇 HA队长 __stdcall HA chty_syq为文文讲过字符串 HA cdcq为文文讲过后缀数组① ② Bluesky007超强的 外省神犇 知名OIer黄学长 一个可爱的蓝孩子qwq ...

  9. BZOJ 5194--[Usaco2018 Feb]Snow Boots(STL)

    5194: [Usaco2018 Feb]Snow Boots Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 81  Solved: 61[Submi ...

  10. Swift5 语言参考(三) 类型

    在Swift中,有两种类型:命名类型和复合类型.一个名为类型是当它的定义可以给出一个特定名称的类型.命名类型包括类,结构,枚举和协议.例如,名为的用户定义类的实例MyClass具有该类型MyClass ...