二十三种设计模式第二篇--工厂模式

news2024/11/24 17:07:58

上篇我们了解了6条设计模式的准则,我相信如果你想了解设计模式,那么你迈出的第一步,我会将上一篇文档里边的6大准则进行一篇有关的代码展示,当然这是题外话了,本篇我们将重点围绕工厂模式进行讲解,天哪,23种设计模式我要记笔记写23篇,有点恐怖呀。

工厂模式

工厂模式的介绍

工厂模式,算是我们接触的最多的设计模式的一种吧。那么,到底什么是工厂模式呢?

工厂方法(Factory Method)模式,是对简单工厂模式进行了抽象、推广。
由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了缺点。通过设计一个抽象的Factory类或接口,这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作,推延到其子类去完成。

其目的是
定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式,使一个类的实例化,延迟到其子类

JDK中我们的Iterator方法:
在这里插入图片描述
Collection接口是一种抽象方法,ArrayList是一种具体的工厂类。
Iterator接口是抽象商品类,ArrayList类中的Iter内部类是具体的商品类。

Collection可以看作是一个总的抽象工厂,它的一些实现这个接口的类,像ArrayList,LinkedHashSet等等可以看作一个个不同的品牌的工厂,而总的产品Iterator接口里面会定义产品所需功能的细节,然后在交给各个品牌不同的工厂来实现。

工厂模式的优点

  1. 使用工厂的方法在一个类的内部去创建对象,比直接去创建对象更加灵活
  2. 实现开闭原则,在不改变工厂的前提条件下,增加新的产品。
  3. 工厂方法模式通过面向对象的方法,将所要创建的具体对象进行创建工作,并将其延伸到子类,进而提供扩展的策略,更好的解决了那种紧密的耦合度关系。

工厂模式的一个小实例

首先我们分析下面这张关于工厂模式的图,我们等下使用具体的代码来实现这张图。

  1. 首先我们创建一个shape接口,里边存放一个draw()方法,接口下边是实现该接口的各种类,并且重写了接口里边的方法。
  2. 创建一个demo项目,来展示效果。
  3. 创建一个ShapeFactory类,作为一个工厂。
    在这里插入图片描述

代码展示:

第一步 创建Shape接口。

public interface Shape {
   void draw();
}

第二步 写接口实现类:

public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("我是 Circle::draw() 方法.");
   }
}
public class Square implements Shape {
 
   @Override
   public void draw() {
      System.out.println("我是 Square::draw() 方法.");
   }
}
public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("我是 Rectangle::draw() 方法.");
   }
}

创建ShapeFactory类

public class ShapeFactory {
    
   //使用 getShape 方法获取形状类型的对象
   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;
   }
}

创建demo类

/**
 * 简单工厂:测试类
 */
public class FactoryPatternDemo {

    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        //获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        //调用 Circle 的 draw 方法
        shape1.draw();
        //获取 Rectangle 的对象,并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        //调用 Rectangle 的 draw 方法
        shape2.draw();
        //获取 Square 的对象,并调用它的 draw 方法
        Shape shape3 = shapeFactory.getShape("SQUARE");
        //调用 Square 的 draw 方法
        shape3.draw();
    }
}

至此,一个简单的工厂模式就设计好了,一眼看过去,发现工厂模式也就那么回事呀。
我将会在有空的时候继续完善本篇文档。

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

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

相关文章

Shell+VCS学习1

Shell脚本常见问题 mkdir rmdir rm mkdir 创建文件夹 mkdir -p filename-p 确保目录名称存在,不存在的就建一个。 mkdir -p runoob2/test若 runoob2 目录原本不存在,则建立一个。(注:本例若不加 -p 参数,且原本 ru…

【C++】反向迭代器的实现

文章目录 1.迭代器的分类2.反向迭代器的使用3.反向迭代器的模拟实现4.list类的反向迭代器实现 1.迭代器的分类 我们随便打开一个容器,看迭代器相关的接口,都可以发现,支持迭代器的容器,其迭代器有以下几类 正向迭代器const正向迭…

软件测试必备的Linux知识(一)

1. Linux 概述 1.1 测试人员为什么学习linux 对于软件测试人员来说,我们测试的任何产品都是基于操作系统。比如我们每天都在使用的QQ软件,它有windows、ios、Android、Mac OS等版本,需要把QQ安装在各个平台上,才能进行相应的测试…

03 KVM虚拟机镜像制作

文章目录 03 KVM虚拟机镜像制作3.1 概述3.2 制作镜像3.2.1 使用root用户安装qemu-img软件包3.2.2 使用qemu-img工具的创建镜像文件 3.3 修改镜像磁盘空间大小3.3.1 查询当前虚拟机镜像磁盘空间大小3.3.2 修改镜像磁盘空间大小3.3.3 查询修改后的镜像磁盘空间大小 03 KVM虚拟机镜…

WPS作图常见问题+LATLEX

【LaTex】LaTex的下载与安装(超详细、超简洁) 表格 1、打开WPS表格,切换至“开始”选项卡,单击“绘图边框”按钮,如下图。 2、鼠标变成如下图一样的笔后,按照斜线表头的方向拉动鼠标,然后就给…

【2023程序员必看】前端行业分析

“前端已死?”|“情绪焦虑?” 最近经常在知乎、脉脉等平台上看到有人在渲染前端就业危机,甚至使用“前端已死”的字眼,颇有“语不惊人死不休”的意味。 “前端已死”更多的是一种焦虑情绪的表达。现阶段的市场行情确实不太好&am…

【LLM】离线部署ChatGLM-6B模型

目录 前言 准备环境 打包环境 下载/上传模型 部署模型 前言 甲方出手,天下我有🤩。圆梦了圆梦了~一直想整一台GPU服务器尝尝鲜,奈何钱包空空,虽然有可以在CPU上部署的方案,但效果却不是让人那么满意&#xff0c…

杭州一公司开出20万月薪/320万年薪抢人!ChatGPT掀起AI热潮,AIGC人才被爆抢

5年工作经历,博士学位,最高月薪20万。 最近,位于杭州未来科技城一家公司,开出了最高320万年薪,招聘AIGC方向算法工程师一名。 ChatGPT在全球掀起了AI热潮,国内互联网大厂纷纷加入战局打造国内版ChatGPT。…

Analysis For Office的一些使用技巧

目录 1. 自由特性下钻停止刷新 2. 直接双击过滤内容 3.重复层级值 4. 从过滤值选参数 5.从Excel复制参数 6. 保存参数值 7.计划值回退到上一步 8. 保存当前导航步骤 1. 自由特性下钻停止刷新 一般我们每次拖一个自由特性到workbook里,报表都会自动刷新。如…

电商败给了直播带货,实体店能靠直播提升销量吗?

根据官方发布的最新数据,直播带货的市场规模将达到4.7万亿元,不少品牌借助直播间触达了上亿的用户,完成了千万级别的销售订单。 目前直播带货已经成为“红海”市场,未来仍然有巨大的发展空间。 一、直播带货打败传统电商 自从电商…

vue3+ts数组去重方法-reactive/ref响应式显示

vue3ts数组去重方法-reactive/ref响应式显示 本文目录 vue3ts数组去重方法-reactive/ref响应式显示简单数组使用 Set 和 扩展运算符(...)将集合转换回数组使用 Set 和 Array.from() 方法将集合转换回数组使用 filter 和 indexOf 进行判断使用 splice 和 …

函函函函函函函函函函函数——two

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…

【DevOps视频】笔记】1. DevOps的诞生

视频官网 目录 一、DevOps介绍 定义: 作用: 核心: 二、软件开发流程 三、流程图 一、DevOps介绍 定义: Development & Operations的缩写,也就是开发&运维DevOps 是一个不断提高效率并且持续不断工作…

(八)Geoprocessing地理处理框架——基本介绍

(八)Geoprocessing地理处理框架——基本介绍 目录 (八)Geoprocessing地理处理框架——基本介绍 1.基本概念2.集成ArcToolbox3.多种使用方式3.1对话框3.2Python窗口3.3模型构建器3.4脚本 4.应用基础4.1启动ArcToolbox4.2激活扩展工…

PostgreSQL中创建索引的消极影响

相信大家在使用数据库中,提高SQL查询速度最简单的办法就是添加相关索引,但是其实我们创建的索引并不一定能用上,有时候顺序扫描也并不见的就比离散的索引扫描差,任何事物我们要辩证的看待,今天我们说明一下创建索引的一…

AQS 抽象同步队列的简单理解

前置知识: 可重入锁又叫递归锁,同一个线程在外层方法获取锁的时候,在进入该线程内层方法会自动获取锁,不会因为之前已经获取过还没释放就阻塞 同一个线程可以多次获得同一把锁 每个锁对象都有一个锁计数器和一个指向持有该锁的…

Python爬虫-D车网近半年(六个月)汽车销量排行榜

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏前面,笔者有单独详细介绍过该平台当前月更新的最新汽车销量排行榜数据。感兴趣的同学,可往前翻阅查看(Python爬虫-某懂车平台之汽车销量排行榜)。 而本文,笔者将详细来介绍该平台近半年…

【git】git提交代码-使用简易指南

1、创建新仓库:git init 创建新文件夹,打开执行:git init ,创建新的git仓库 2、检出仓库:git clone 执行该命令,以创建一个本地仓库的克隆版本:git clone /path/to/repository 如果是远端服务器…

一文解析Systrace 的原理、流程及定制

一、原理和基本流程 Systrace是android性能调试优化的常用工具,它可以收集进程的活动信息,如界面布局、UI渲染、binder通信等;也可以收集内核信息,如cpu调度、IO活动、中断等;这些信息会统一时间轴,在Chro…

【ROS仿真实战】Gazebo仿真平台介绍及安装方法(一)

文章目录 前言一、Gazebo简介二、Gazebo仿真平台的基本概念三、Gazebo仿真平台的安装方法四、总结 前言 Gazebo仿真平台是一个广泛应用于机器人研发、测试和教育等领域的开源软件。它可以模拟机器人的运动、感知和控制等行为,并提供了丰富的物理引擎、传感器模拟和…