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

news/2024/11/16 11:59:52/

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

简单工厂

定义

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

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

场景coding

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

  • Video

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

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

    public class PythonVideo extends Video {@Overridepublic 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 {@Overridepublic void produce() {System.out.println("制作Java课程视频");}
    }public class PythonVideo extends Video {@Overridepublic void produce() {System.out.println("制作Python课程视频");}
    }public class FEVideo extends Video {@Overridepublic void produce() {System.out.println("制作FE课程视频");}
    }
  • 创建者

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

    public class JavaVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {return new JavaVideo();}
    }public class PythonVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {return new PythonVideo();}
    }public class FEVideoFactory extends VideoFactory {@Overridepublic 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 {@Overridepublic Video getVideo() {return new JavaVideo();}@Overridepublic Article getArticle() {return new JavaArticle();}
    }public class PythonCourseFactory implements CourseFactory {@Overridepublic Video getVideo() {return new PythonVideo();}@Overridepublic 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 {@Overridepublic void produce() {System.out.println("编写Java课程手记");}
    }
    public class PythonArticle extends Article {@Overridepublic void produce() {System.out.println("编写Python课程手记");}
    }
    public class PythonVideo extends Video {@Overridepublic void produce() {System.out.println("录制Python课程视频");}
    }
    public class JavaVideo extends Video {@Overridepublic void produce() {System.out.println("录制Java课程视频");}
    }
    
  • 同一颜色为一个产品族,如代码例子中的 Java课程产品族 和 Python 产品族

    在这里插入图片描述

实例应用

  • java.sql.Connection

  • java.sql.Statement

  • Mybatis中的sqlSessionFactory


http://www.ppmy.cn/news/19677.html

相关文章

RISC-V Instruction Formats

原始内容如下&#xff1a; RISC-V Instruction Formats The RISC-V Instruction Set Manual Volume I: User-Level ISA lists 15 instruction formats where some of the formats have multiple variants. For the ‘.insn’ pseudo directive the assembler recognizes some o…

建模杂谈系列199 APIFunc Task

说明 春节这段时间就完全没干活,偶尔空下来会想一想要做的事。过去的想法和实验都比较分散,现在正是要慢慢的聚拢,归类,各司其职。 内容 1 楔子 如果把要做的事浓缩成一句话,那么就是:通过构建一套数据存储、处理的系统,提供强大的决策支持,产生巨大的经济效益。 …

代码随想录算法训练营Day48动态规划:198.打家劫舍,213.打家劫舍||,337.打家劫舍|||

打家劫舍是dp解决的经典问题 198.打家劫舍 文章链接&#xff1a;代码随想录 (programmercarl.com) 思路&#xff1a;自己的思路是&#xff0c;将数组重新划分为两个数组&#xff0c;分别对两个数组进行01背包计算最大收益&#xff0c;然后比较两个收益&#xff0c;取两者中的…

量化选股——基于多因子模型的量化策略(第1部分—因子测算策略构建)

文章目录1.多因子模型概述2.因子挖掘3.多因子策略4.多因子策略构建基于多因子的策略通用流程Fama-French三因子因子效果测算方法因子测算结论&量化策略构建东西有点多&#xff0c;拆开成多个文章&#xff0c;边写边整合~&#xff0c;应该会分成2部分&#xff1a; 第1部分—…

spring boot前后端交互之数据格式转换

在前后端分离开发的项目种&#xff0c;前端获取数据的方式基本都是通过Ajax。请求方法也有所不同,常见的有POST,GET,PUT,DELETE等。甚至连请求的数据类型都不一样&#xff0c;x-www-form-urlencodeed,form-data,json等。 那么在前后端交互过程中&#xff0c;具体的数据该如何接…

申请Moonbeam Accelerator孵化计划申请答题指导

Moonbeam Accelerator是一个为期10 周的孵化计划&#xff0c;由Moonbeam基金会、Arrington Capital和Rokk3r共同推出&#xff0c;旨在帮助初创团队提高技术、业务、营销、金融和融资技能&#xff0c;助力您的Web3创业之梦。 申请孵化计划有任何限制吗&#xff1f;没有&#xff…

二、Java框架之Spring注解开发

文章目录1. IOC/DI注解开发1.1 Component注解ComponentController Service Repository1.2 纯注解开发模式1.3 注解开发bean管理ScopePostConstruct PreDestroy1.4 注解开发依赖注入Autowired QualifierValuePropertySource1.5 第三方bean管理Beanimport&#xff08;多个Config类…

Coolify系列02-从0到1超详细手把手教你上手Coolify

重启 如果由于某种原因&#xff0c;你的实例崩溃了&#xff0c;你可以用下面的命令重新启动它: wget -q https://get.coollabs.io/coolify/install.sh \ -O install.sh; sudo bash ./install.sh -r防火墙设置 您需要在防火墙中允许以下端口 Coolify: 3000 (required)Revers…