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

抽象工厂模式又称为Kit模式,属于对象创建型模式。

抽象工厂模式和工厂方法模式类似都是由四部分组成:

  • 抽象工厂(AbstractFactory)角色:担任这个角色的是抽象工厂模式的核心,是与应用系统的商业逻辑无关的。通常使用Java接口或者抽象Java类实现。所有的具体工厂必须实现这个Java接口或继承这个抽象的Java类。

  • 具体工厂(Factory)角色:这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统商业逻辑紧密相关的。

  • 抽象产品(AbstractProduct)角色:担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java接口或者抽象Java类实现这一角色。

  • 具体产品(Product)角色:抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java类实现这个角色。

与工厂方法模式不同的是,抽象工厂模式中的具体工厂不再是只能创建一种产品,一个具体的工厂可以创建一个产品族的产品。

简单来说就是在工厂方法模式上面更抽象了一层,这个我们举例说明

=========================================================================

还是生产手机的例子,我们需要生产小米,华为,苹果三种手机。这次我们把手机更加的细化:手机由电池,屏幕,还有操作系统构成,我们通过输入手机,在对应的工厂中实现创建手机,并更细化的拿到手机的配置信息。这时候我们需要考虑,不同的电池,屏幕,OS,都是不同的产品族,那么按照之前的工厂模式设计,我每一次来一个新的手机,都要重新去写一个创建手机的具体方法。这工作量很大,那么我们就把创建手机抽象出来,生产零件抽象出来。那么我不论是增加新的零件还是新的手机,都不会对我们的项目结构有过大的影响。

=========================================================================

抽象工厂角色:

抽象工厂为手机生产厂,我们定义为手机由电池,屏幕,还有操作系统构成。我们可以理解为这是一个手机组装的代工厂,这个代工厂不生产零件,他们只会根据手机的具体需求去拿到相应的零件进行组装。

package AbstractFactoryPattern;import AbstractFactoryPattern.dao.Battery;
import AbstractFactoryPattern.dao.OperationSystem;
import AbstractFactoryPattern.dao.PhoneScreen;/*** @author Zeyu Wan* @version 1.0.0* @ClassName SmartPhoneFactory.java* @Description 智能手机的构成方式* 仅仅定义生产同一族产品不同等级结构的产品接口,具体由子类工厂来实现* @createTime 2022年02月10日 17:15:00*/
public abstract class SmartPhoneFactory {/*** 手机屏幕* @return 手机屏幕*/public abstract PhoneScreen screen();/***操作系统* @return 操作系统*/public abstract OperationSystem os();/***电池* @return 电量*/public abstract Battery battery();
}

具体工厂角色:

我们通过具体的工厂组装具体的手机,可以简单理解为代工厂中手机具体的流水线:

苹果手机工厂类 :

package AbstractFactoryPattern.factories;
import AbstractFactoryPattern.SmartPhoneFactory;
import AbstractFactoryPattern.dao.Battery;
import AbstractFactoryPattern.dao.OperationSystem;
import AbstractFactoryPattern.dao.PhoneScreen;
import AbstractFactoryPattern.dao.battery.BYD;
import AbstractFactoryPattern.dao.os.IOS;
import AbstractFactoryPattern.dao.screen.BOE;
import AbstractFactoryPattern.dao.screen.Corning;/*** @author Zeyu Wan* @version 1.0.0* @ClassName AppleFactory.java* @Description 苹果手机工厂类* @createTime 2022年02月14日 08:44:00*/
public class AppleFactory extends SmartPhoneFactory {@Overridepublic PhoneScreen screen() {return new Corning();}@Overridepublic OperationSystem os() {return new IOS();}@Overridepublic Battery battery() {return new BYD();}
}

华为手机工厂类 :

package AbstractFactoryPattern.factories;import AbstractFactoryPattern.SmartPhoneFactory;
import AbstractFactoryPattern.dao.Battery;
import AbstractFactoryPattern.dao.OperationSystem;
import AbstractFactoryPattern.dao.PhoneScreen;
import AbstractFactoryPattern.dao.battery.BYD;
import AbstractFactoryPattern.dao.os.Android;
import AbstractFactoryPattern.dao.screen.BOE;/*** @author Zeyu Wan* @version 1.0.0* @ClassName HuaweiFactory.java* @Description 华为工厂类* @createTime 2022年02月14日 09:08:00*/
public class HuaweiFactory extends SmartPhoneFactory {@Overridepublic PhoneScreen screen() {return new BOE();}@Overridepublic OperationSystem os() {return new Android();}@Overridepublic Battery battery() {return new BYD();}
}

小米手机工厂类 :

package AbstractFactoryPattern.factories;import AbstractFactoryPattern.SmartPhoneFactory;
import AbstractFactoryPattern.dao.Battery;
import AbstractFactoryPattern.dao.OperationSystem;
import AbstractFactoryPattern.dao.PhoneScreen;
import AbstractFactoryPattern.dao.battery.Samsung;
import AbstractFactoryPattern.dao.os.Android;
import AbstractFactoryPattern.dao.screen.Corning;
import SimpleFactoryPattern.factory.SimplePhoneFactory;/*** @author Zeyu Wan* @version 1.0.0* @ClassName XiaoMiFactory.java* @Description 小米手机工厂类* @createTime 2022年02月14日 09:06:00*/
public class XiaoMiFactory extends SmartPhoneFactory {@Overridepublic PhoneScreen screen() {return new Corning();}@Overridepublic OperationSystem os() {return new Android();}@Overridepublic Battery battery() {return new Samsung();}
}

抽象产品角色:

手机是由电池,屏幕,OS构成,但是我们存在不同的屏幕,不同的电池,和不同的OS。比如苹果使用的是IOS,小米使用的安卓。我们需要组装厂对需要的零件下订单,这就简单理解为下游零件厂的抽象类。

电池抽象类:

package AbstractFactoryPattern.dao;/*** @author Zeyu Wan* @version 1.0.0* @ClassName Battery.java* @Description 电池抽象类* @createTime 2022年02月10日 17:26:00*/
public abstract class Battery {/***电量*/public abstract void quantity();
}

操作系统抽象类 :

package AbstractFactoryPattern.dao;/*** @author Zeyu Wan* @version 1.0.0* @ClassName OperationSystem.java* @Description 操作系统抽象类* @createTime 2022年02月10日 17:22:00*/
public abstract class OperationSystem {/***操作系统版本*/public abstract void  version();
}

屏幕抽象类 :

package AbstractFactoryPattern.dao;/*** @author Zeyu Wan* @version 1.0.0* @ClassName PhoneScreen.java* @Description 手机屏幕抽象类* @createTime 2022年02月10日 17:21:00*/
public abstract class PhoneScreen {/***硬度等级*/public abstract void hardLevel();
}

具体产品(Product)角色

具体的产品就是上面的抽象类下的 订单,也就是实际需要生产的具体对象。也就是具体的屏幕,OS等。

屏幕:

京东方屏幕:

package AbstractFactoryPattern.dao.screen;import AbstractFactoryPattern.dao.PhoneScreen;/*** @author admin* @version 1.0.0* @ClassName BOE.java* @Description 京东方屏幕* @createTime 2022年02月14日 08:49:00*/
public class BOE extends PhoneScreen {/*** @Description 构造函数*/public BOE(){System.out.println("BOE Screen");}@Overridepublic void hardLevel() {System.out.println("Level 8");}
}

康宁屏幕 :

package AbstractFactoryPattern.dao.screen;import AbstractFactoryPattern.dao.PhoneScreen;/*** @author admin* @version 1.0.0* @ClassName Corning.java* @Description 康宁屏幕* @createTime 2022年02月14日 08:47:00*/
public class Corning extends PhoneScreen {/*** @Description 构造函数*/public Corning(){System.out.println("Corning Screen");}@Overridepublic void hardLevel() {System.out.println("Level 10");}
}

电池:

比亚迪电池:

package AbstractFactoryPattern.dao.battery;import AbstractFactoryPattern.dao.Battery;/*** @author Zeyu Wan* @version 1.0.0* @ClassName BYD.java* @Description 比亚迪电池* @createTime 2022年02月14日 08:51:00*/
public class BYD extends Battery {/*** @Description 构造函数*/public BYD(){System.out.println("BYD Battery");}@Overridepublic void quantity() {System.out.println("3200mAh");}
}

三星电池 :

package AbstractFactoryPattern.dao.battery;import AbstractFactoryPattern.dao.Battery;/*** @author Zeyu Wan* @version 1.0.0* @ClassName Samsung.java* @Description 三星电池* @createTime 2022年02月14日 08:54:00*/
public class Samsung extends Battery {/*** @Description 构造函数*/public Samsung(){System.out.println("Samsung Battery");}@Overridepublic void quantity() {System.out.println("4100mAh");}
}

系统:

安卓系统:

package AbstractFactoryPattern.dao.os;import AbstractFactoryPattern.dao.OperationSystem;/*** @author Zeyu Wan* @version 1.0.0* @ClassName Android.java* @Description 安卓系统* @createTime 2022年02月14日 08:56:00*/
public class Android extends OperationSystem {/*** @Description 构造函数*/public Android(){System.out.println("Android System");}@Overridepublic void version() {System.out.println("Android 12");}
}

IOS系统:

package AbstractFactoryPattern.dao.os;import AbstractFactoryPattern.dao.OperationSystem;/*** @author Zeyu Wan* @version 1.0.0* @ClassName IOS.java* @Description IOS系统* @createTime 2022年02月14日 08:57:00*/
public class IOS extends OperationSystem {/*** @Description 构造函数*/public IOS(){System.out.println("IOS System");}@Overridepublic void version() {System.out.println("IOS 15");}
}

主函数

主函数下,我们不需要知道手机如何被创建、组合和表达,我们需要做的只是给代工厂下订单,代工厂就可以制造对应的手机了

package AbstractFactoryPattern;import AbstractFactoryPattern.dao.Battery;
import AbstractFactoryPattern.dao.OperationSystem;
import AbstractFactoryPattern.dao.PhoneScreen;
import AbstractFactoryPattern.factories.AppleFactory;
import AbstractFactoryPattern.factories.HuaweiFactory;
import AbstractFactoryPattern.factories.XiaoMiFactory;/*** @author Zeyu Wan* @version 1.0.0* @ClassName GetAbsPhone.java* @Description 主方法* @createTime 2022年02月14日 09:10:00*/
public class GetAbsPhone {public static void main(String[] args) throws Exception {String type = "IPhone13ProMax";SmartPhoneFactory phone = getPhone(type);getInfo(phone);}/*** @Description 创建手机的方法*/public static SmartPhoneFactory getPhone(String phone) throws Exception {if (!phone.isEmpty()){switch (phone){case "IPhone13ProMax":return new AppleFactory();case "HuaWeiP50":return new HuaweiFactory();case "XiaoMi11U":return new XiaoMiFactory();default:System.out.println("Create Error: Error Type");throw new Exception();}}else {System.out.println("Create Error: No Type Identify");throw new Exception();}}/*** @Description 获取对应的手机信息*/public static void getInfo(SmartPhoneFactory phone){System.out.println("屏幕信息:");PhoneScreen screen = phone.screen();screen.hardLevel();System.out.println("系统信息:");OperationSystem os = phone.os();os.version();System.out.println("电池信息:");Battery battery = phone.battery();battery.quantity();}
}

 模式优点 :

  • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
  • 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

模式缺点 :

  • 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
  • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

《设计模式入门》 3.抽象工厂模式相关推荐

  1. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

  2. 设计模式二、抽象工厂模式

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

  3. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  4. 设计模式普及之抽象工厂模式

    本文是读<Android源码设计模式解析与实战>后笔记 抽象工厂的定义 为创建一组相关或者是相互依赖的对象提供一个借口,而不需要指定它们的具体类. 抽象工厂的使用场景 一个对象族有相同的约 ...

  5. 【设计模式】之抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...

  6. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  7. java设计模式六(抽象工厂模式)

    java设计模式-抽象工厂模式 一.概述 抽象工厂模式是在工厂模式的基础上,加上了一个管理工厂的超级工厂.也就是说,工厂的作用是管理各种有相似功能的类,而超级工厂的作用是管理这些工厂. 二.模式示例: ...

  8. 【设计模式】之抽象工厂模式详解与应用(三)

    开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...

  9. 设计模式之笔记--抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...

  10. 设计模式之【抽象工厂模式】

    抽象工厂模式 (Abstract Factory Pattern) 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品 ...

最新文章

  1. Spring Cloud Feign的两种使用姿势
  2. python变量区分大小写吗_Python变量名是不是区分大小写的
  3. c语言pi的乘法,c语言 根据公式求出π的近似值。
  4. XML解析(二),DOM解析XML
  5. 使用eclipse以及Juint进行测试
  6. 算法笔记--KMP算法 EXKMP算法
  7. 计算机英语讲课笔记01
  8. android fragment 教程,Android Fragment教程总结
  9. ArcEngine和GDAL读写栅格数据机制对比(一)
  10. Spring全家桶——SpringCloud之Feign(Finchley版)
  11. 为Android系统定制重启功能
  12. 三菱M70M700数控系统简明调试手册 PLC编程手册 设定手册
  13. 数字电压表设计程序用c语言at89c51 adc0808,51单片机的ADC0808数字电压表设计
  14. php微信测试号配置代码,微信测试号实现微信分享等功能【转载】
  15. ORB_SLAM2编译build_ros.sh时报错([rosbuild] Error from directory check: /opt/ros/kinetic/share)
  16. 读书笔记:iPod 之父在《创造:在正确的方向上持续努力》中的思考
  17. 二极管(三):电源防反接
  18. 【踩坑记录】priority_queue 第三个模板参数和sort 的第三个形参的区别;仿函数、自定义排序函数、lambda 函数分别传入;传入类型和对象的区别;
  19. 工资倒挂,IT 行业薪资潜规则如何规避?
  20. fcpx如何清除缓存?Final Cut Pro X 清除缓存方法

热门文章

  1. 商业保理行业的下一站
  2. 周志华机器学习(二)
  3. 如何同时使用内网和外网
  4. 阿里云使用宝塔面板部署 Hexo 博客
  5. 企微消息分享小程序 出现第一次能打开,第二次打开卡在白屏的情况
  6. 二战失败的落魄人(有些开心可很落魄)
  7. 前端网页三剑客------JavaScript基础
  8. A股level2委托队列十档AI量化行情数据对比
  9. krb5安装包 linux_【RedHat Linux】kerberos 客户端配置
  10. html+css+javaScript实现炫酷烟花表白(云雾状粒子文字3D开场)七夕情人节表白/520表白源码HTML...