java25种设计模式抽象工厂模式

news2024/12/25 9:01:45

Java设计模式 - 抽象工厂模式

抽象工厂模式是另一个创建模式。
抽象工厂模式,也称为工厂的工厂,有一个工厂创建其他工厂。
当使用抽象工厂模式时,我们首先使用超级工厂创建工厂,然后使用创建的工厂创建对象。
简单来说,抽象工厂模式就是在工厂模式之上再创建一个超级工厂。
接下来看实例

实例

下面的代码展示了如何使用抽象工厂模式。
我们将要创建形状和打印机。对于形状,我们会有圆形,矩形和正方形。对于打印机,我们将有纸张打印机,网络打印机和屏幕打印机。
也就是我们先创建两个普通的工厂模式,普通工厂模式怎么设计我们在上一章已经讲过了,接下来我们直接创建
我们先来创建形状这个工厂
首先创建一个形状接口

interface Shape {
   void draw();
}

再创建三个实现类来实现形状Shape接口类的draw接口

public class Rectangle implements Shape {
    public void draw() {
        System.out.println("Rectangle");
    }
}
public class Circle implements Shape {
    public void draw() {
        System.out.println("Circle");
    }
}
public class Square implements Shape {
    public void draw() {
        System.out.println("Square");
    }
}

形状工厂创建完了,我们再来创建打印机工厂
一样的,先创建一个打印机接口类,并且创建一个print成员接口

public interface Printer {
	void print();
}

再来创建三个实现类来实现Printer 这个接口类的print接口

public class PaperPrinter implements Printer{

   @Override
   public void print() {
      System.out.println("paper");
   }
}
public class WebPrinter implements Printer{

   @Override
   public void print() {
      System.out.println("web");
   }
}

public class ScreenPrinter implements Printer{

   @Override
   public void print() {
      System.out.println("screen");
   }
}

两个工厂都创建好了
然后,我们创建一个抽象类来获取打印机和形状对象的工厂。

public abstract class AbstractFactory {
   abstract Printer getPrinter(String type);
   abstract Shape getShape(String shape) ;
}

再创建两个类根据给定的信息扩展AbstractFactory以生成具体类的对象。
相当于在下面的两个工厂之上再创建两个超级工厂。
第一个超级工厂

public class ShapeFactory extends AbstractFactory {
  
   @Override
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }    
      if(shapeType.equalsIgnoreCase("Circle")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("Rectangle")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("Square")){
         return new Square();
      }
      return null;
   }
   
   @Override
   Printer getPrinter(String type) {
      return null;
   }
}

第二个超级工厂

public class PrinterFactory extends AbstractFactory {
  
   @Override
   public Shape getShape(String shapeType){
      return null;
   }
   
   @Override
   Printer getPrinter(String type) {
   if(type == null){
      return null;
    }    
  if(type.equalsIgnoreCase("paper")){
      return new PaperPrinter();
  } else if(type.equalsIgnoreCase("web")){
      return new WebPrinter();
  } else if(type.equalsIgnoreCase("Screen")){
      return new ScreenPrinter();
  }
  return null;
 }
}

再创建一个Factory类来初始化两个超级工厂,后面可以通过传递Shape或Printer等信息来获取工厂。

public class FactoryProducer {
   public static AbstractFactory getFactory(String choice){
      if(choice.equalsIgnoreCase("Shape")){
         return new ShapeFactory();
      } else if(choice.equalsIgnoreCase("Printer")){
         return new PrinterFactory();
      }
      return null;
   }
}

下面的代码展示了如何使用抽象工厂模式。

public class Main {
   public static void main(String[] args) {

      //通过Shape来获取形状这个超级工厂
      AbstractFactory shapeFactory = FactoryProducer.getFactory("Shape");

      // 通过Circle 来获取 Circle这个类并执行draw方法
      Shape shape1 = shapeFactory.getShape("Circle");

      //call draw method of Shape Circle
      shape1.draw();

      //get an object of Shape Rectangle
      Shape shape2 = shapeFactory.getShape("Rectangle");

      //call draw method of Shape Rectangle
      shape2.draw();
      
      //get an object of Shape Square 
      Shape shape3 = shapeFactory.getShape("Square ");

      //call draw method of Shape Square
      shape3.draw();

      // 通过Printer来获取打印机这个超级工厂
      AbstractFactory printerFactory = FactoryProducer.getFactory("Printer");

    Printer printer1 = printerFactory.getPrinter("Paper");
    printer1.print();
    Printer printer2 = printerFactory.getPrinter("Web");
    printer2.print();
    Printer printer3 = printerFactory.getPrinter("Screen");
    printer3.print();
   }
}

上面的代码生成以下结果。
在这里插入图片描述这就是抽象类工厂模式
简单来说就是两个及以上的普通的工厂模式通过抽象类整合到一起,然后通过给定的标识类获取超级工厂,然后再用超级工厂通过给定的标识获取具体的实现类并执行方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

事件循环机制(Event Loop)和宏任务(macro-tast)微任务(micro-tast),详细讲解!!!

“事件循环机制” 和 “宏任务微任务” 也是前端面试中常考的面试题了。首先,要深刻理解这些概念的话,需要回顾一些知识点。知识点回顾1、进程与线程进程。 程序运行需要有它自己的专属内存空间,可以把这块内存空间简单的理解为进程每个应用至…

计算机求解满足三角形各边数字之和相等的数字填充

圆圈处不重复的填入1至9&#xff0c;使得每条边的四个数字相加的总和相等。 求解思路&#xff1a; 数组中存放1到9的数字&#xff0c;每次随机交换两个数字&#xff0c;构建出新的数字组合&#xff0c;计算这个数字组合是否符合要求。 #include <stdio.h> #include <…

SpringBoot实现Excel导入导出,简单好用

EasyPoi简介 POI是Java操作MicroOffice&#xff08;如对Excel的导入导出&#xff09;的一个插件。POI的全称是&#xff08;Poor Obfuscation Implementation&#xff09;&#xff0c;POI官网地址是 http://poi.achache.org/index.html 。 EasyPoi对POI进行了优化&#xff0c;…

SVN vs Git 不是技术之争,而是生态之争

师父&#xff08;80 后老员工&#xff09;&#xff1a;小吉啊&#xff0c;我看我们文档越来越多了&#xff0c;手动管理起来很费劲。你去搞一个 SVN 来用一哈&#xff0c;做个版本控制&#xff0c;这样大家都方便。 徒弟&#xff08;95 后新力量&#xff09;&#xff1a;师父啊…

电脑快捷方式删除文件后四种找回方法

快捷指令是一种用作替代快捷键操作的技术。也可以称为“快捷键”&#xff0c;“快捷方式”或“快捷键序列”&#xff0c;它们允许用户在非常快速和方便的方式建立特定操作序列&#xff0c;这对于执行重复性或提高效率非常有用。通过使用快捷指令&#xff0c;您可以执行快速复制…

pod进阶

一.资源限制当定义 Pod时可以选择性地为每个容器设定所需要的资源数量。最常见的可设定资源是CPU和内存大小&#xff0c;以及其他类型的资源。当为 pod 中的容器指定了request资源时&#xff0c;调度器就使用该信息来决定将Pod 调度到哪个节点上。当还为容器指定了limit资源时&…

C++Primer16.1.6节练习

练习16.28&#xff1a; 简易的shared_ptr代码如下 #include <iostream> #include <vector> #include <list> using namespace std;//shared_ptr模板 template<typename T>class SharedPtr {friend SharedPtr<T>& MakeShared(T* t); public…

docker部署MySQL主从服务

一.主从同步流程关于MySQL主从复制主要同步的是binlog日志&#xff0c;涉及到三个线程&#xff0c;一个运行在主节点&#xff08;log dump thread&#xff09;&#xff0c;其余两个(I/O thread, SQL thread)运行在从节点&#xff0c;如下图所示:当主库数据发生变更时&#xff0…

【JavaWeb】EL表达式(191-202)

191.EL表达式-什么是EL表达式&#xff0c;以及它的作用 什么是 EL 表达式&#xff0c;EL 表达式的作用? EL 表达式的全称是&#xff1a;Expression Language。是表达式语言。 EL 表达式的什么作用&#xff1a;输出&#xff0c;EL 表达式主要是代替 jsp 页面中的表达式脚本在…

第三章 opengl之纹理

OpenGL纹理纹理环绕方式纹理过滤多级渐远纹理加载和创建纹理stb_image.h生成纹理纹理的应用纹理单元纹理 用stb_image.h库&#xff0c;原先用SOIL库也可以实现。 可以为每个顶点添加颜色来增加图形的细节。但是想得到一个真实的图形&#xff0c;需要足够多的顶点&#xff0c;…

定时任务调度方案——Xxl-Job

定时任务调度方案 随着系统规模的发展&#xff0c;项目的组织结构以及架构越来越复杂&#xff0c;业务覆盖的范围越来越广&#xff0c;定时任务数量日益增多&#xff0c;任务也变得越来越复杂&#xff0c;尤其是为了满足在用户体量日历增大时&#xff0c;系统能够稳定运行&…

汽车改色避坑指南

关于汽车改色&#xff0c;真的不是只看颜色看价格那么简单。 如何选择一家靠谱的改色店&#xff1f;要看这家店是否正规&#xff0c;是否有完备的售后和质保流程&#xff0c;后续剐蹭、磕碰、划痕是否可以修复&#xff1f;是否提前告知注意事项&#xff0c;以及改色后备案流程&…

浅谈车载测试之智能座舱人机交互

1、引言 目前&#xff0c;汽车不仅在动力源、驱动方式和驾驶体验上发生了变化&#xff0c;驾驶舱也告别了传统的枯燥机械和电子空间&#xff0c;智能化水平飙升&#xff0c;成为继家庭和办公室以外人们生活之后的“第三空间”。通过人脸&#xff1b;指纹识别、语音 / 手势交互…

【线程-J.U.C】

Lock J.U.C最核心组件&#xff0c;Lock接口出现之前&#xff0c;多线程的并发安全只能由synchronized处理&#xff0c;但java5之后&#xff0c;Lock的出现可以解决synchronized的短板&#xff0c;更加灵活。 Lock本质上是一个接口&#xff0c;定义了释放锁&#xff08;unlock&…

解决:centos7如何解决网络不可达和wget: 无法解析主机地址 “downloads.mysql.com”

遇到此类问题可能会有多重解决方法&#xff0c;需要一个一个的去排除。 1、查看自己的网络设置是不是设置的NAT模式&#xff0c;设置完成后再去ping一下网络地址。 2、ping一下百度看能不能拼成功&#xff0c;下图是ping成功的样式。&#xff08;如果不行继续往下走&#xff0…

牛客sql题目练习

Sql3描述 题目&#xff1a;现在运营需要查看用户来自于哪些学校&#xff0c;请从用户信息表中取出学校的去重数据。 示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315femal…

PowerShell攻击指南

文章目录一&#xff1a;PowerShell简介1.1&#xff1a;基本概念1.2&#xff1a;执行策略与绕过1.3&#xff1a;常用命令二&#xff1a;PowerSploit2.1&#xff1a;PowerSploit安装2.2&#xff1a;PowerSploit攻击实战2.2.1&#xff1a;直接shellcode反弹meterpreter shell2.2.2…

【C/C++每日一练】总目录(不断更新中...)

C/C 2023.03 20230303 1. 字符串相乘 ★★ 2. 单词拆分 II ★★★ 3. 串联所有单词的子串 ★★★ 20230302 1. 个位数是6&#xff0c;且能被3整除的五位数共有多少个&#xff1f; ☆ 2. 不同方式求n的阶乘 ★ 3. 报数游戏 ★☆ 20230301 1. 冒泡排序法排序 ★ …

视频号频出10w+,近期爆红的账号有哪些?

回顾2月&#xff0c;视频号持续放出大动作&#xff0c;不仅进行了16小时不间断的NBA全明星直播&#xff0c;还邀请国际奥委会入驻&#xff0c;分享奥运的最新资讯。视频号成为越来越多官方机构宣传推广的有效渠道。官方积极入驻&#xff0c;内容创作生态也在同步繁荣发展&#…

中村成洋《垃圾回收的算法与实现》PDF 读书笔记

观前提醒 为了能够锻炼自己&#xff0c;我会查阅大量外文不停的修改内容&#xff0c;少部分会提示成中文。 可能有误&#xff0c;请见谅 提示&#xff1a;若是觉得阅读困难&#xff0c;可以看如下内容 脚本之家可获取&#xff0c;若失效可私信浏览器的沙拉查词扩展&#xf…