创建设计模式 - 抽象工厂设计模式

欢迎来到java示例中的Abstract Factory Design Pattern。摘要工厂设计模式是创造模式之一。抽象工厂模式几乎类似于工厂模式,除了它更像工厂的工厂。

目录[ 隐藏 ]

  • 1抽象工厂

    • 1.1抽象工厂设计模式超类和子类
    • 1.2每个子类的工厂类
    • 1.3抽象工厂设计模式的好处
    • 1.4 JDK中的抽象工厂设计模式示例
    • 1.5抽象工厂设计模式视频教程

抽象工厂

如果您熟悉java中的工厂设计模式,您会注意到我们有一个Factory类。此工厂类根据提供的输入返回不同的子类,工厂类使用if-else或switch语句来实现此目的。

在抽象工厂模式中,我们摆脱if-else块并为每个子类设置工厂类。然后是一个Abstract Factory类,它将根据输入工厂类返回子类。起初,它似乎令人困惑但是一旦你看到实现,就很容易理解和理解Factory和Abstract Factory模式之间的细微差别。

就像我们的工厂模式帖子一样,我们将使用相同的超类和子类。

抽象工厂设计模式超类和子类

Computer.java


package com.journaldev.design.model;public abstract class Computer {public abstract String getRAM();public abstract String getHDD();public abstract String getCPU();@Overridepublic String toString(){return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();}
}

PC.java


package com.journaldev.design.model;
public class PC extends Computer {private String ram;private String hdd;private String cpu;public PC(String ram, String hdd, String cpu){this.ram=ram;this.hdd=hdd;this.cpu=cpu;}@Overridepublic String getRAM() {return this.ram;}@Overridepublic String getHDD() {return this.hdd;}@Overridepublic String getCPU() {return this.cpu;}
}

Server.java


package com.journaldev.design.model;
public class Server extends Computer {private String ram;private String hdd;private String cpu;public Server(String ram, String hdd, String cpu){this.ram=ram;this.hdd=hdd;this.cpu=cpu;}@Overridepublic String getRAM() {return this.ram;}@Overridepublic String getHDD() {return this.hdd;}@Overridepublic String getCPU() {return this.cpu;}
}

每个子类的工厂类

首先,我们需要创建一个Abstract Factory接口或抽象类

ComputerAbstractFactory.java


package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
public interface ComputerAbstractFactory {public Computer createComputer();
}

请注意,该createComputer()方法正在返回超类的实例Computer。现在我们的工厂类将实现此接口并返回其各自的子类。

PCFactory.java


package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
public class PCFactory implements ComputerAbstractFactory {private String ram;private String hdd;private String cpu;public PCFactory(String ram, String hdd, String cpu){this.ram=ram;this.hdd=hdd;this.cpu=cpu;}@Overridepublic Computer createComputer() {return new PC(ram,hdd,cpu);}
}

同样,我们将有一个Server子类的工厂类。

ServerFactory.java


package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
import com.journaldev.design.model.Server;public class ServerFactory implements ComputerAbstractFactory {private String ram;private String hdd;private String cpu;public ServerFactory(String ram, String hdd, String cpu){this.ram=ram;this.hdd=hdd;this.cpu=cpu;}@Overridepublic Computer createComputer() {return new Server(ram,hdd,cpu);}
}

现在我们将创建一个消费者类,它将为客户端类提供创建子类的入口点。

ComputerFactory.java


package com.journaldev.design.abstractfactory;
import com.journaldev.design.model.Computer;
public class ComputerFactory {public static Computer getComputer(ComputerAbstractFactory factory){return factory.createComputer();}
}

请注意,它的一个简单的类和getComputer方法是接受ComputerAbstractFactory参数和返回Computer对象。此时,实施必须变得清晰。

让我们编写一个简单的测试方法,看看如何使用抽象工厂来获取子类的实例。

TestDesignPatterns.java


package com.journaldev.design.test;
import com.journaldev.design.abstractfactory.PCFactory;
import com.journaldev.design.abstractfactory.ServerFactory;
import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.design.model.Computer;
public class TestDesignPatterns {public static void main(String[] args) {testAbstractFactory();}private static void testAbstractFactory() {Computer pc = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));Computer server = com.journaldev.design.abstractfactory.ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));System.out.println("AbstractFactory PC Config::"+pc);System.out.println("AbstractFactory Server Config::"+server);}
}

上述计划的输出将是:


AbstractFactory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
AbstractFactory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

这是抽象工厂设计模式实现的类图。

抽象工厂设计模式的好处

  • 抽象工厂设计模式提供了接口而不是实现的代码方法。
  • 抽象工厂模式是“工厂工厂”,可以轻松扩展以容纳更多产品,例如我们可以添加另一个子类笔记本电脑和工厂LaptopFactory。
  • 抽象工厂模式是健壮的,并避免工厂模式的条件逻辑。

JDK中的抽象工厂设计模式示例

  • javax.xml.parsers.DocumentBuilderFactory中的newInstance#()
  • javax.xml.transform.TransformerFactory中的newInstance#()
  • javax.xml.xpath.XPathFactory#的newInstance()

抽象工厂设计模式视频教程

我最近在YouTube上上传了一个视频,用于抽象工厂设计模式。在视频中,我将讨论何时以及如何实现抽象工厂模式。我还讨论了工厂模式和抽象工厂设计模式之间的区别。

创建设计模式 - 抽象工厂设计模式相关推荐

  1. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

  2. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  3. 用C# (.NET Core) 实现抽象工厂设计模式

    本文的概念性内容来自深入浅出设计模式一书.上一篇文章讲了简单工厂和工厂方法设计模式 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂. 披萨店的需求变更 现在披萨店在各地授权了很多连 ...

  4. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  5. 抽象工厂设计模式示例

    本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因,并了解何时以 ...

  6. 抽象工厂设计模式解释

    抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮"的一部分)属于 ...

  7. 设计模式之二抽象工厂设计模式

    继上篇简单工厂设计模式之后,今天继续讲解抽象工厂设计模式.在简单工厂中,我们的工厂类一次只可以处理一类产品.那么如果我们想处理多类产品,简单工厂是满足不了的.必须要用抽象工厂设计模式. 我们先从概念上 ...

  8. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  9. java工厂模式和抽象工厂_Java中的抽象工厂设计模式

    java工厂模式和抽象工厂 Welcome to Abstract Factory Design Pattern in java example. Abstract Factory design pa ...

最新文章

  1. 如何在用户登录时SAP时自动执行Tcode或者其他一些东西
  2. 杂项题的基本解题思路——2、图片隐写术
  3. ajax返回数据类型为JSON数据的处理
  4. dbcc_name 空的_DBCC INPUTBUFFER和sys.dm_exec_input_buffer DMF概述
  5. MySQL(三) —— 约束以及修改数据表
  6. 《数据结构与算法 C语言版》—— 2.2线性表的顺序表示与实现
  7. 基于SPSS的聚类分析原理概述
  8. 404丨戳心!等我写完这行代码就和你“吃鸡”
  9. Source Insight 4.0安装破解及简单使用
  10. openwrt使用花生壳域名
  11. 凸优化第三章凸函数 3.3共轭函数
  12. Tableau 读书笔记
  13. 毛玻璃matlab,QA清单(毛玻璃赛题)
  14. 西涝东雪!数场冬季风暴轮番侵袭美国 多地预警
  15. numpy之轴向统计API
  16. 简易公交车查询系统c语言,公交线路免费api接口代码
  17. 【Java多数据源实现教程】实现动态数据源、多数据源切换方式
  18. 我是如何从测试转为产品的
  19. ubuntu期货穿透式监管相关信息查看
  20. 计算机系统维护岗位,酒店电脑系统维护员的岗位职责

热门文章

  1. Take a Photo and Upload it on Mobile Phones with HTML5
  2. spring中需要掌握的25个常用注解
  3. Ubuntu 14.04 或者16.04开启root账户登录和图形界面登录root时候的报错解决方法
  4. 自定义播放器 winform
  5. git-撤销工作与的修改-回退缓存区的修改
  6. dj鲜生-05-配置-静态目录-模板目录-后台语言时区
  7. webrtc后续补丁
  8. 如何在Ubuntu 18.04上安装Django
  9. react-native 路由 react-native-router-flux
  10. Python系统性能信息模块