厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>

news2024/10/6 22:30:11

厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>

简单工厂

定义

由一个工厂对象决定创建出哪一种产品类的实例(严格意义并不是设计模式,更是一种风格)

  • 类型:创建型,但不属于GOF23种设计模式
  • 适用场景
    • 工厂类负责创建的对象比较少
    • 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
  • 缺点
    • 工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则
    • 反射实现 简单工厂 一定程度上 实现开闭原则

场景coding

  • 新建视频,通过【视频工厂】创建不同类型的视频

  • Video

    public abstract class Video {
        public abstract void produce();
    }
    
  • JavaVideo

    public class JavaVideo extends Video {
        @Override
        public void produce() {
            System.out.println("Java课程视频");
        }
    }
    
  • PythonVideo

    public class PythonVideo extends Video {
        @Override
        public void produce() {
            System.out.println("Python课程视频");
        }
    }
    
  • VideoFactory

    public class VideoFactory {
        // 类创建
        public Video getVideo(Class c) {
            Video video = null;
            try {
                video = (Video) Class.forName(c.getName()).newInstance();
            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
                e.printStackTrace();
            }
            return video;
        }
    
        // 字符串创建
        public Video getVideo(String type) {
            if ("java".equalsIgnoreCase(type)) {
                return new JavaVideo();
            } else if ("python".equalsIgnoreCase(type)) {
                return new PythonVideo();
            }
            return null;
        }
    }
    

    在这里插入图片描述

应用实例

  • JDK中的Calender类

    在这里插入图片描述

    类图查看:

在这里插入图片描述

  • logback中的LoggerContext

在这里插入图片描述

在这里插入图片描述

  • JDBC中的DriverManger

    在这里插入图片描述

工厂方法

定义

简单来说,作为工厂生产的方法

定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类;工厂方法让类的实例化推迟到子类中进行(创建型)

适用场景

  • 创建对象需要大量重复的代码
  • 客户端(应用层)不依赖于产例如何被创建
  • 实现等细节,一个类通过其子类来指定创建哪个对象

优点

  • 用户只需要关心所需产品对应的工厂,无须关心创建细节
  • 加入新产品符合开闭原则,对扩展开放,提高可扩展性

缺点

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度

场景coding

制作不同视频的场景

  • 产品:

    public abstract class Video {
        public abstract void produce();
    }
    
  • 具体产品:

    public class JavaVideo extends Video {
        @Override
        public void produce() {
            System.out.println("制作Java课程视频");
        }
    }
    
    public class PythonVideo extends Video {
        @Override
        public void produce() {
            System.out.println("制作Python课程视频");
        }
    }
    
    public class FEVideo extends Video {
        @Override
        public void produce() {
            System.out.println("制作FE课程视频");
        }
    }
    
    
  • 创建者

    public abstract class VideoFactory {
        public abstract Video getVideo();
    }
    
  • 具体创建者

    public class JavaVideoFactory extends VideoFactory {
        @Override
        public Video getVideo() {
            return new JavaVideo();
        }
    }
    
    public class PythonVideoFactory extends VideoFactory {
        @Override
        public Video getVideo() {
            return new PythonVideo();
        }
    }
    
    public class FEVideoFactory extends VideoFactory {
        @Override
        public Video getVideo() {
            return new FEVideo();
        }
    }
    

    在这里插入图片描述

    四个角色:

    1. 产品
    2. 具体产品
    3. 创建者
    4. 具体创建者

应用实例

  • Collection中Iterator方法

    在这里插入图片描述

    在这里插入图片描述

    以ArrayList为例子,他们之间的关系为:

    1. 工厂模型:Collection
    2. 实际工厂:ArrayList
    3. 产品:Iterator 接口
    4. 具体产品:ArrayList 中的Iter内部类
  • URLStreamHandlerFactory 中的 createURLStreamHandler

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 工厂模型:URLStreamHandlerFactory

  • 具体工厂:Factory

  • 产品模型: URLStreamHandler

  • 具体产品:实际实现的各种Handler

抽象工厂

定义

定义与类型

  • 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口

  • 无须指定它们具体的类

  • 类型:创建型

适用场景

  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

优点

  • 具体产品在应用层代码隔离,无须关心创建细节

  • 将一个系列的产品族统一到一起创建

缺点

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难
  • 需要修改抽象工厂的接口
  • 增加了系统的抽象性和理解难度

在这里插入图片描述

与工厂方法的侧重点:

  • 工厂方法针对的是产品等级结构:
    • 如 视频工厂、文章工厂、笔记工厂等 具体某类产品
  • 抽象工厂方法针对的是一个产品族
    • 如 小米工厂(生产小米手机、小米扫地机器人等小米品牌的产品)

场景coding

  • 抽象工厂
// 课程的抽象工厂
public interface CourseFactory {
    // 课程视频
    Video getVideo();
    // 课程笔记
    Article getArticle();
}
  • 具体工厂

    public class JavaCourseFactory implements CourseFactory {
        @Override
        public Video getVideo() {
            return new JavaVideo();
        }
    
        @Override
        public Article getArticle() {
            return new JavaArticle();
        }
    }
    
    public class PythonCourseFactory implements CourseFactory {
        @Override
        public Video getVideo() {
            return new PythonVideo();
        }
    
        @Override
        public Article getArticle() {
            return new PythonArticle();
        }
    }
    
  • 工厂的产品:

    public abstract class Article {
        public abstract void produce();
    }
    
    public abstract class Video {
        public abstract void produce();
    }
    
  • 具体产品:

    public class JavaArticle extends Article {
        @Override
        public void produce() {
            System.out.println("编写Java课程手记");
        }
    }
    public class PythonArticle extends Article {
        @Override
        public void produce() {
            System.out.println("编写Python课程手记");
        }
    }
    public class PythonVideo extends Video {
        @Override
        public void produce() {
            System.out.println("录制Python课程视频");
        }
    }
    public class JavaVideo extends Video {
        @Override
        public void produce() {
            System.out.println("录制Java课程视频");
        }
    }
    
  • 同一颜色为一个产品族,如代码例子中的 Java课程产品族 和 Python 产品族

    在这里插入图片描述

实例应用

  • java.sql.Connection

  • java.sql.Statement

  • Mybatis中的sqlSessionFactory

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

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

相关文章

PyAutoFEP Tutorial--基于Gromacs

PyAutoFEP 自由能微扰计算–基于Gromacs 简介 注意&#xff1a;以下教程假定读者熟悉分子动力学 (MD) 和自由能微扰 (FEP) 理论。此外&#xff0c;了解 GROMACS 工具、拓扑和输入文件也很有用。整个教程都使用 Linux 命令行。最后&#xff0c;建议用户阅读并参考 PyAutoFEP 手…

17种编程语言+10种排序算法

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、前…

AI算法工程师 | 09机器学习-概率图模型(二)朴素贝叶斯算法与文本分类(1)

目录机器学习 - 概率图模型 之 朴素贝叶斯算法一、贝叶斯与朴素贝叶斯算法1、相关概念2、朴素贝叶斯分类的工作流程3、朴素贝叶斯的优缺点二、文本分类1、one-hot 编码2、TF-IDF 词频-逆文档频率3、代码&#xff1a;基于朴素贝叶斯实现文本分类&#xff08;使用 Python 手动实现…

力扣刷题| 239. 滑动窗口最大值、347.前 K 个高频元素

文章目录LeetCode 239. 滑动窗口最大值题目链接&#x1f517;思路代码实现LeetCode 347.前 K 个高频元素题目链接&#x1f517;思路代码实现LeetCode 239. 滑动窗口最大值 题目链接&#x1f517; LeetCode 239. 滑动窗口最大值 思路 这是使用单调队列的经典题目 难点是如何…

html列表

1.无序列表&#xff1a; 场景&#xff1a;在网页中表示一组无顺序之分的列表 如&#xff1a;新闻列表 标签组成&#xff1a; ul&#xff1a; 表示无序列表的整体&#xff0c;用于包裹li标签 li&#xff1a;表示无序列表的每一项&#xff0c;用于包含每一行的内容 注意点&…

Makefile学习③:编译流程

Makefile学习③&#xff1a;编译流程 学习前准备 实现七个文件的编写&#xff0c;例如&#xff1a;实现加减乘三个函数的.c文件和.h文件的编写加上主函数main.c&#xff0c;方便后续使用Makefile将其分别编译。 博主的demo如下&#xff1a; 使用gcc 命令将所有文件编译出来生…

线程控制--Linux

文章目录线程理解线程的优点与缺点进程的多个线程共享线程控制线程创建线程终止线程等待线程分离总结线程理解 谈及线程&#xff0c;就不得不谈起进程与线程的关系了。学习完前面有关进程的知识&#xff0c;之前我们对进程的定义是&#xff1a;内核数据结构代码和数据。但是今…

C语言return的用法详解,C语言函数返回值详解

函数的返回值是指函数被调用之后&#xff0c;执行函数体中的代码所得到的结果&#xff0c;这个结果通过 return 语句返回。return 语句的一般形式为&#xff1a;return 表达式;或者&#xff1a;return (表达式);有没有( )都是正确的&#xff0c;为了简明&#xff0c;一般也不写…

python使用类装饰器生成函数的使用日志

1 什么是类装饰器 在了解类装饰器之前&#xff0c;建议大家先了解装饰器的概念。 装饰器知识快速入门链接 类装饰器是 Python 中的一种特殊类型的装饰器&#xff0c;它是一个类而不是一个函数。与函数装饰器不同&#xff0c;类装饰器可以在运行时接收参数并返回一个可调用的对…

Linux文件系统(IO缓冲区+磁盘+软硬链接)

目录 一、缓冲区 1.1 缓冲区是内存的一块存储空间 1.2 缓冲区的作用 1.3 C式缓冲区 1.3.1 C语言的FILE结构体 1.3.2 C式缓冲区刷新策略 二、OS与内核缓冲区 2.1 数据从缓冲区到磁盘 2.2 fsync() 数据免缓冲直接到磁盘文件 2.3 检验用户与内核缓冲区 三、文件系统 3…

11. 好客租房-ElasticSearch入门学习

Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

分享144个ASP源码,总有一款适合您

ASP源码 分享144个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 144个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/15O9p6a8XlNN0u-wFKEkJqQ?pwd8354 提取码&#x…

Go 语言

Go语言是云计算时代的语言 Go语言2007年诞生于Google&#xff0c;2009年开源&#xff0c;Go语言与区块链技术一样年轻 本文是对Go语言基本语法的总结 目录 Go词法单元 token Go的token 标识符 内置数据类型标识符 常量值标识符 空白标识符 关键字 程序整体结构的关键字…

VBA提高篇_05日期时间函数

文章目录日期函数1. Date()2. Time()3. Now()时间数据解析函数时间运算函数DateDiff() 数据时间差DateAdd() 时间点指定跨越拓展日期函数 VBA中默认日期系统格式: #1/26/2023 12:20:25 # #月/日/年 时:分:秒# 1. Date() 获取当前系统的时间(年/月/日) 精度: 精确到秒 范围: 公…

Tomcat-HTTP服务器介绍、安装与使用

文章目录一、概述二、下载安装三、介绍四、启动Tomcat一、概述 Tomcat&#xff0c;是一个 HTTP 服务器&#xff0c;就是在 TCP 服务器的基础上&#xff0c;加上了一些额外的功能。使用 HTTP 服务器的 API。就可以来提取HTTP请求的内容&#xff0c;也可以构造HTTP响应 二、下载…

【GPLT 二阶题目集】L2-015 互评成绩

学生互评作业的简单规则是这样定的&#xff1a;每个人的作业会被k个同学评审&#xff0c;得到k个成绩。系统需要去掉一个最高分和一个最低分&#xff0c;将剩下的分数取平均&#xff0c;就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式&#xff…

HBase原理和设计

简介 HBase —— Hadoop Database的简称&#xff0c;Google BigTable的另一种开源实现方式&#xff0c;从问世之初&#xff0c;就为了解决用大量廉价的机器高速存取海量数据、实现数据分布式存储提供可靠的方案。从功能上来讲&#xff0c;HBase不折不扣是一个数据库&#xff0…

EcoStruxure Operator Terminal Expert 操作员终端专家

EcoStruxure Operator Terminal Expert&#xff08;以前称为 Vijeo XD&#xff09;是一款具有最新 UI 设计和手势的触摸屏配置软件&#xff0c;使您能够为 Magelis HMI 和 iPC 创建和编辑应用程序屏幕。 特点&#xff1a; 变量——内存中用于存储数据的命名空间。创建您需要的所…

MS-Model【3】:Medical Transformer

文章目录前言1. Abstract & Introduction1.1. Abstract1.2. Introduction2. Medical Transformer (MedT)2.1. Model structure2.2. Attention2.2.1. Self-Attention Overview2.2.2. Axial-Attention2.2.3. Gated Axial-Attention2.3. Local-Global Training2.4. Loss funct…

定位 position属性 相对定位 绝对定位 固定定位 定位下的居中 多个定位元素重叠时 补充

目录定位position属性相对定位绝对定位固定定位定位的做法&#xff1a; 定位下的居中多个定位元素重叠时补充定位 视觉格式化模型&#xff0c;大体上将页面中盒子的排列分为三种方式&#xff1a; 常规流浮动&#xff1a;float定位&#xff1a;position 定位&#xff1a;手动…