文章目录

  • 前言
  • 一、认识抽象工厂模式
  • 二、实现抽象工厂模式
    • 2.1、代码实现
    • 2.2、分析说明
  • 总结
  • 参考资料

前言

本篇博客是关于抽象工厂的实现,若文章中出现相关问题,请指出!

对应代码地址:Gitee(demo-exer/ java-Lear23designpatterns)、Github(java-demo/ java-Lear23designpatterns)

所有博客文件目录索引:博客目录索引(持续更新)

一、认识抽象工厂模式

抽象工厂模式也是工厂模式的一种,相对于简单工厂模式、工厂方法模式考虑的是一类产品的生产,而抽象工厂模式则是考虑多个产品族的创建。在抽象工厂模式中,有一个抽象工厂,该抽象工厂中提供了产生不同抽象产品的方法。其中抽象工厂是可以创建工厂的工厂!

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口无需指定它们具体的类。

应用场景

  1. 提供一个产品类的工厂,所有的产品以同样的接口出现,使用者不依赖于具体的实现。
  2. 强调一些列相关的产品对象(如下面示例的产品族),一起使用创建对象需要大量重复的代码。

结构:抽象工厂、具体工厂;抽象产品、具体产品。

优缺点

  • 优点:获取具体系列产品只需要通过具体系列工厂获取,无序关心创建的细节;
  • 缺点:规定了所有可能被创建的产品集合,若是出现某一个系列出现新的产品就会导致所有的系列都会创建指定的接口!扩展新产品困难,增加了系统的抽象性与复杂度。

引用 C语言中文网—抽象工厂模式图

二、实现抽象工厂模式

2.1、代码实现

Abstract目录下的是抽象工厂模式代码:

抽象产品IphoneRouter

//手机接口
public interface Iphone {void start();void music();void ring();void stop();
}//路由器接口
public interface Router {void start();void stop();void work();
}
  • 抽象工厂解决的是一个产品族的创建,品牌可以有多个,一个品牌也会生产不同的产品,其不同品牌的相同产品我们就可以将其进行抽象,由于我们注重的并不是一个产品的创建而是一个产品族,所以我们还需要抽象一个品牌接口即相当于是一个抽象工厂,该抽象工厂可以创建具体的工厂(实现其接口)。

抽象工厂Brand

//品牌接口(可根据不同的品牌获取不同的产品)
public interface Brand {Iphone getPhone();Router getRouter();
}

具体产品HuaWeiPhoneLianXiangPhoneHuaWeiRouterLianXiangRouter

//手机的实现类
//华为牌手机
public class HuaWeiPhone implements Iphone {@Overridepublic void start() {System.out.println("华为手机启动中...");}@Overridepublic void music() {System.out.println("华为手机播放音乐中...");}@Overridepublic void ring() {System.out.println("华为手机开启闹铃中...");}@Overridepublic void stop() {System.out.println("华为手机关机中...");}
}//联想牌手机
public class LianXiangPhone implements Iphone {@Overridepublic void start() {System.out.println("联想手机正在启动...");}@Overridepublic void music() {System.out.println("联想手机播放音乐中...");}@Overridepublic void ring() {System.out.println("联想手机开启闹铃...");}@Overridepublic void stop() {System.out.println("联想手机关机中...");}
}//路由器的实现类
//华为路由器
public class HuaWeiRouter implements Router{@Overridepublic void start() {System.out.println("华为路由器正在启动...");}@Overridepublic void stop() {System.out.println("华为路由器正在关机...");}@Overridepublic void work() {System.out.println("华为路由器开始工作...");}
}//联想路由器
public class LianXiangRouter implements Router{@Overridepublic void start() {System.out.println("联想路由器正在启动...");}@Overridepublic void stop() {System.out.println("联想路由器正在关机...");}@Overridepublic void work() {System.out.println("联想路由器开始工作...");}
}

具体工厂:既然产品有了,那我们一定是从指定工厂中来获取产品,接着我们通过抽象工厂来创建工厂类

//华为工厂(提供华为手机、华为路由器)
public class HuaWeiFactory implements Brand{@Overridepublic Iphone getPhone() {return new HuaWeiPhone();}@Overridepublic Router getRouter() {return new HuaWeiRouter();}
}//联想工厂(提供联想手机、联想路由器)
public class LianXiangFactory implements Brand{@Overridepublic Iphone getPhone() {return new LianXiangPhone();}@Overridepublic Router getRouter() {return new LianXiangRouter();}
}

最终我们来创建一个顾客类Customer,获取不同品牌的产品并且使用产品:

public class Customer {public static void main(String[] args) {//获取华为工厂Brand huawei = new HuaWeiFactory();Iphone phone = huawei.getPhone();//华为工厂获取华为手机phone.start();phone.music();phone.ring();phone.stop();Router router = huawei.getRouter();//华为工厂获取华为路由器router.start();router.work();router.stop();//----------------------System.out.println();Brand lianxiang = new LianXiangFactory();Iphone phone1 = lianxiang.getPhone();//华为工厂获取华为手机phone1.start();phone1.music();phone1.ring();phone1.stop();Router router1 = lianxiang.getRouter();//华为工厂获取华为路由器router1.start();router1.work();router1.stop();}
}


2.2、分析说明

在上面顾客类中的测试方法里,我们通过不同的工厂来获取到不同品牌的产品,具体的产品进行了代码的隔离,无需关心创建过程中的细节!

我们看下上面整体代码的依赖图

  • 将具体产品类型进行抽象,将具体生产商抽象成一个工厂并提供获取抽象产品的接口。
  • 当我们需要具体的产品时只需要通过具体的工厂的方法即可获取,而不用再去管其中的细节。

若是我们要添加其他品牌如小米,我们只需要实现Brand接口创建一个工厂,分别实现其接口即可,符合开闭原则;若是新增一个产品A,那么就需要在Brand中添加获取A的接口,那么其所有实现该接口的工厂类都需要修改,这就不符合开闭原则。

总结

1、抽象工厂由四个部分组成:抽象工厂、具体工厂;抽象产品、具体产品。

2、添加新的产品族时只需要实现抽象工厂接口创建一个工厂并实现其中的方法即可,符合了开闭原则;而对于添加某个新产品则需要添加抽象工厂的接口,即造成所有抽象工厂的实现类都要进行修改,这就违反了开闭原则。

3、针对于抽象工厂模式不可以增加产品,可以增加产品族!(一旦增加产品就会造成大量修改)。

4、对于抽象工厂模式针对于的是产品族!


参考资料

视频:狂神说Java—抽象工厂模式

[1]. 抽象工厂模式(详解版)


我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接

设计模式之抽象工厂模式(Java实现)相关推荐

  1. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  2. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

  3. 设计模式之抽象工厂模式---abstract factory

    模式的介绍 模式的定义 Provide an interface for creating families of related or dependent objects without speci ...

  4. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  5. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  6. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  7. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  8. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  9. C#设计模式(4)——抽象工厂模式

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

  10. 简单工厂和 工厂设计模式--抽象工厂模式--Java实现

    简单工厂不是23种设计模式 工厂方法·模式 :定义一个创建对象得接口,但是让实现这个接口的类来决定实例化哪一个类,工厂方法能使得类的实例化推迟到子类中进行 工厂方法缺点: 增加了类的数量,增加复杂度 ...

最新文章

  1. 使用Categorical_endcoder包对标称变量进行个性化编码
  2. 在接触到服务器时破解密码、及改ssh端口
  3. iOS开发UI篇—Quartz2D使用(绘制基本图形)
  4. redis 底层数据结构 压缩列表 ziplist
  5. php的json_encode实例,php json_encode()函数返回json数据实例代码
  6. 放寒假的硕博研究生将经历什么?
  7. c# 中通快递对接_快递共配是什么?行业前景怎么样?
  8. jQuery 请指出'$'和'$.fn'的区别?或者说出'$.fn'的用途。
  9. 二叉树前序,中序,后序遍历的迭代实现,实现思路及代码
  10. 计算机专业未来希望,中国人才最紧缺的6个大学专业,希望你不要错过。
  11. 程序中变量分布的区域总结 堆 栈 字符常量区 全局数据区 静态存储区
  12. oracle数据库笔记---pl/sql的基础使用方法
  13. 拼多多API SDK【拼多多开放平台】
  14. chrome源代码下载 编译 linux,源代码编译chrome os
  15. Git 修改历史提交中的用户名和邮箱
  16. Idear常用快捷键
  17. 在C++中实现aligned_malloc
  18. 大一下数据结构编程实验——线性结构及其应用
  19. CentOS8-1905 本地dnf源挂载
  20. Scala语言基础(2)

热门文章

  1. 如何下载和安装iOS 15公测版【附更新建议】
  2. 一秒实现免费下载百度文库资料的方法
  3. 微信浏览器下载音频文件php,教你怎么下载公众号里面的音频文件
  4. 简谈FPGA实现高斯滤波
  5. 嵌入式C语言知识总结
  6. CSS 3之鼠标特效
  7. [Unity]Curvy插件随机生成装饰物
  8. JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
  9. Google Guice简介
  10. 如何在计算机设置鼠标宏,鼠标宏设置教程