Java设计模式学习记录-抽象工厂模式
前言
上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上。
抽象工厂模式
抽象工厂模式是围绕着一个超级工厂创建其他工厂。这个超级工厂被称为其他工厂的工厂,主要是为了解决接口选择问题。
举例说明:
还是继续上篇用户使用手的例子,现在生产手机的工厂发现,不同的手机使用的配件也不相同,需要单独的生产配件。例如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设计模式学习记录-抽象工厂模式的更多相关文章
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- Java设计模式学习记录-享元模式
前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 《Java设计模式》之抽象工厂模式
场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...
- 《JAVA设计模式》之抽象工厂模式(Abstract Factory)
场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...
- 设计模式学习心得<抽象工厂模式 Abstract Factory>
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- 【java设计模式】-03抽象工厂模式
抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ...
- java设计模式之二抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- java设计模式-----3、抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创 ...
随机推荐
- verilog中defparam的用法 (verilog调用底层模块(只改变)参数的传递)
当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式: 1)defparam 重定义参数 语法:defparam path_n ...
- nfs 客户端挂住
mount -t nfs -o soft,retry=1,timeo=10,intr 192.168.9.27:/mnt/vm /mnt/nfs-vm 可以让NFS client在连接不到NFS se ...
- cxGrid控件过滤筛选后如何获更新筛选后的数据集
cxGrid控件过滤筛选后如何获更新筛选后的数据集 (2015-06-19 12:12:08) 转载▼ 标签: delphi cxgrid筛选数据集 cxgrid过滤 分类: Delphi cxGri ...
- 自定义Chrome缩放比例
我想要设置Chrome页面缩放为120%,但是Chrome只提供110% 125%,根本没有让我舒心的缩放比例. 强迫症发作,谷歌了半天没有一个很好的解决方案. 虽然也有不少第三方扩展可以自定义缩放比 ...
- winform 查找控件并获取特定类型控件
//通过反射获取所有控件集合 System.Reflection.FieldInfo[] fieldInfo = this.GetType().GetFields(System.Reflection. ...
- Lerning Entity Framework 6 ------ Using a commandInterceptor
Sometimes, We want to check the original sql statements. creating a commandInterceptor is a good way ...
- linux 服务器脚本采集数据中文无法执行错误
问题描述:在 RHEL6 版本的服务器上使用脚本操作数据库,其中一个SQL的字段值为中文,每次使用 crontab定时 执行该脚本无法获取数据,实现预期效果,而手动执行正常. oracle clien ...
- jspm 简介
借鉴:http://www.jianshu.com/p/4aba847b3e8c 功能 1. 支持加载JavaScript各种模块化的写法:AMD.CommonJS.标准化的ES6模块... 2. 包 ...
- (原创)Callable、FutureTask中阻塞超时返回的坑点
直接上代码 import java.util.concurrent.Callable; public class MyCallable implements Callable<String> ...
- 【原创】Your Connection is not private
用Chrome打开google等https网站时碰到问题: “your connection is not private”. 后来发现是跟GoAgent的安全证书有关系(我用XX.NETFQ) 解决 ...