秋招Java后端开发冲刺——设计模式

本文介绍Java中的代理模式,及一些常见的模式应用。

一、Java设计模式

Java中最常见的设计模式主要有23种,如表所示:

表格:Java设计模式分类

类型设计模式
创建型模式单例模式(Singleton Pattern)
工厂方法模式(Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
结构型模式适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰者模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)

二、单例模式(美团面试真题)

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式通常用于需要全局唯一实例的场景,如配置管理、日志记录、数据库连接等。单例模式可分为饿汉式和懒汉式两种。

1. 饿汉式(线程安全):在类加载时就创建实例,但是可能会造成资源浪费。
代码实现:

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}

2. 懒汉式:在使用时才创建对象实例,因此面对多线程时会产生线程安全问题。
代码:

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

3. 线程安全的单例模式(使用双重锁)

public class Singleton{private static Singleton instance;private Singleton(){}//获取单例的方法public static  Singleton getInstance(){//第一重校验if(instance == null){synchronized (Singleton.class){//第二重校验if(instance == null){instance = new Singleton();}}}return instance;}
}

三、工厂方法模式 VS 抽象方法模式

1. 工厂方法模式

  • 工厂方法模式为每种产品创建一个具体工厂类,然后在使用时根据需要使用相应的具体工厂创建对象
  • 优点:符合开闭原则,可以增加新的产品类而无需修改现有代码
  • 缺点:需要为每种产品创建一个具体工厂类,增加了系统的复杂度和代码量
  • 示例
// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {public void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {public void use() {System.out.println("Using Product B");}
}// 抽象工厂
abstract class Creator {public abstract Product factoryMethod();
}// 具体工厂A
class ConcreteCreatorA extends Creator {public Product factoryMethod() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteCreatorB extends Creator {public Product factoryMethod() {return new ConcreteProductB();}
}
public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.factoryMethod();productA.use(); // 输出: Using Product ACreator creatorB = new ConcreteCreatorB();Product productB = creatorB.factoryMethod();productB.use(); // 输出: Using Product B}
}

2. 抽象方法模式

  • 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • 优点
    ① 分离了具体类的生成,使得产品之间的依赖关系更加一致。
    ② 提供了一个一致的接口,可以创建多个产品对象,使产品族的更换变得容易
  • 缺点:新增产品族时需要修改抽象工厂接口,违反了开闭原则,增加复杂性
  • 示例
// 抽象产品A
interface ProductA {void use();
}// 抽象产品B
interface ProductB {void use();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {public void use() {System.out.println("Using Product A1");}
}// 具体产品B1
class ConcreteProductB1 implements ProductB {public void use() {System.out.println("Using Product B1");}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {public void use() {System.out.println("Using Product A2");}
}// 具体产品B2
class ConcreteProductB2 implements ProductB {public void use() {System.out.println("Using Product B2");}
}// 抽象工厂
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {public ProductA createProductA() {return new ConcreteProductA1();}public ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {public ProductA createProductA() {return new ConcreteProductA2();}public ProductB createProductB() {return new ConcreteProductB2();}
}
public class Client {public static void main(String[] args) {AbstractFactory factory1 = new ConcreteFactory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.use(); // 输出: Using Product A1productB1.use(); // 输出: Using Product B1AbstractFactory factory2 = new ConcreteFactory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.use(); // 输出: Using Product A2productB2.use(); // 输出: Using Product B2}
}

3. 二者区别(华为面试)

特性工厂方法模式 (Factory Method)抽象工厂模式 (Abstract Factory)
定义定义一个创建对象的接口,但由子类决定实例化哪个类。提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
使用场景当一个类不知道它所需要的对象的具体类时。当系统要独立于它的产品的创建、组合和表示时。
优点1. 符合开闭原则。
2. 客户端不需要修改代码就可以使用新创建的对象。
1. 分离了具体类的生成。
2. 提供了一致的接口,便于创建多个相关产品对象。
缺点1. 需要为每种产品创建一个具体工厂类。
2. 增加了系统的复杂度和代码量。
1. 新增产品族时需要修改抽象工厂接口,违反开闭原则。
2. 增加了系统的复杂度。
主要角色1. 抽象产品
2. 具体产品
3. 抽象工厂
4. 具体工厂
1. 抽象产品
2. 具体产品
3. 抽象工厂
4. 具体工厂
产品创建的粒度只创建单一产品对象。创建一系列相关或依赖的产品对象。

四、策略模式

1. 定义
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。
2. 示例

interface Strategy {void execute();
}class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Strategy A executed.");}
}class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Strategy B executed.");}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}
  1. 常见应用

五、观察者模式

1. 定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2. 示例(海康威视笔试:楼层着火通知)

// 观察者接口
interface Observer {void update(int floor); // 更新方法,传入楼层信息
}
// 具体的观察者类(保安类)
class SecurityGuard implements Observer {private String name;public SecurityGuard(String name) {this.name = name;}@Overridepublic void update(int floor) {System.out.println("Security Guard " + name + " received fire alert from floor " + floor);if (floor == Integer.parseInt(name)) {System.out.println("Security Guard " + name + " is handling the fire.");} else {System.out.println("Security Guard " + name + " is not responsible for this floor.");}}
}
// 被观察者接口
interface  Subject{void registerObserver(Observer observer); // 注册观察者void removeObserver(Observer observer); // 移除观察者void notifyObservers(int floor); // 通知观察者
}// 具体主题类(楼层类)
class Floor implements Subject {private List<Observer> observers; // 观察者列表public Floor() {this.observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(int floor) {for (Observer observer : observers) {observer.update(floor);}}// 模拟楼层着火public void fireAlert(int floor) {System.out.println("Fire alert on floor " + floor);notifyObservers(floor);}
}

六、外观模式

  1. 定义
    为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这一接口使得这一子系统更加容易使用
  2. 示例(海康笔试:以电脑启动为例)
// CPU 类
class CPU {public void start() {System.out.println("CPU is starting...");}
}// Disk 类
class Disk {public void start() {System.out.println("Disk is starting...");}
}// Memory 类
class Memory {public void start() {System.out.println("Memory is starting...");}
}// 外观类
class ComputerFacade {private CPU cpu;private Disk disk;private Memory memory;public ComputerFacade() {this.cpu = new CPU();this.disk = new Disk();this.memory = new Memory();}public void startComputer() {System.out.println("Starting computer...");disk.start();cpu.start();memory.start();System.out.println("Computer started successfully.");}
}

七、责任链模式

1. 定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
2. 示例

在这里插入代码片abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}
class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(int request) {if (request < 10) {System.out.println("Handler1 handled request " + request);} else if (successor != null) {successor.handleRequest(request);}}
}
class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10) {System.out.println("Handler2 handled request " + request);} else if (successor != null) {successor.handleRequest(request);}}
}

八、Java IO中设计模式

  1. 装饰者模式
    装饰者模式允许动态地将职责添加到对象中,通过将对象封装在装饰对象中来增强对象的功能。(InputStream 和 OutputStream 及其子类)
    2. 适配器模式
    适配器模式允许将一个类的接口转换为另一个接口,以便不同接口的类可以一起工作。(InputStreamReader 和 OutputStreamWriter 类)
    3. 桥接模式
    桥接模式用于将抽象部分与它的实现部分分离,使它们可以独立变化。(Reader 和 Writer 抽象类及其具体实现类)
    4. 迭代器模式
    迭代器模式用于提供一种方法来顺序访问集合中的每个元素,而不暴露其底层表示。(Scanner 类用于逐行读取输入)
    5. 责任链模式
    FilterInputStream 和 FilterOutputStream 类
    6. 工厂方法模式
    FileReader 和 FileWriter 类

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

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

相关文章

MYSQL 四、mysql进阶 5(InnoDB数据存储结构)

一、数据库的存储结构&#xff1a;页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的&#xff0c;确切说时存储在页结构中&#xff0c;另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;Mysql服务器上的存储引擎负责对表…

Cesium 实战 - 自定义纹理材质系列之 - 动态扩散效果

Cesium 实战 - 自定义纹理材质系列之 - 动态扩散效果 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种…

World of Warcraft [CLASSIC] Level 70 Dire Maul (DM)

[月牙钥匙] [大型爆盐炸弹] World of Warcraft [CLASSIC] Level 70 厄运之槌&#xff0c;完美贡品&#xff0c;Dire Maul &#xff08;DM&#xff09; Foror‘s Compendium of Dragon Slaying 佛洛尔的屠龙技术纲要 因为不是兽王宝宝&#xff0c;而且开始位置放的不对&am…

C# —— 方法参数ref和out的作用

public static void Test(ref int a){a 10;}public static void GetValue(out int x){x 10;} ref 和 out 分别使用在方法的参数前面 ref 关键字可以使参数变成引用类型的参数&#xff0c; int a 10; Test(ref a); Console.WriteLine(a); 如果方法参数不加ref; 结果10&…

洛谷U389682 最大公约数合并

这道题最后有一个性质没有想出来&#xff0c;感觉还是有一点遗憾。 性质一、贪心是不对的 8 11 11 16虽然第一次选择8和16合并是最优的&#xff0c;但是如果合并两次的话8 11 11是最优的。 性质二 、有1的情况就是前k1个&#xff0c;也就是说&#xff0c;很多情况下取前k1都…

0000电子技术基础概述

数电 未来课的基础 以前是模块、器件级 现在是 系统级 价格、性能、 技术更新快速的好处&#xff1a;得到了实惠 坏处&#xff1a;工程师需要不断地学习&#xff0c;不变就容易out&#xff0c;要用发展的眼光看待问题 了解基础知识、还要有前沿概念。 理论课、实践课要相结…

CNN神经网络调参技巧

一、基本网络结构 1.若干块&#xff0c;每块&#xff1a;卷积BN激活池化 2.若干块&#xff0c;每块&#xff1a;卷积激活Dropout 3.若干块&#xff0c;每块&#xff1a;fc激活Dropout 二、技巧 1. 损失曲线 常见曲线是先快速下降后趋于平缓&#xff0c;如果线性下降&…

mybatisplus自带的雪花算法(IdType.ASSIGN_ID)无法自动生成弊端缺点,以及改进方法

前言 今日在使用mybatisplus的雪花算法自动给id赋值时发现怎么都是null的情况&#xff0c;这尼玛测了半天&#xff0c;终于发现巨坑&#xff0c;废话不多说&#xff0c;直接上干货 IService.save 只有调用IService中的save方法才能正常生成id&#xff0c;像IService.saveBatc…

Vue移动端动态表单生成组件

FormCreate 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持6个UI框架&#xff0c;适配移动端&#xff0c;并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件&#xff0c;再复杂的表单都可以轻松搞定。 帮助文档 | 源码下载…

Day35:2734. 执行字串操作后的字典序最小字符串

Leetcode 2734. 执行字串操作后的字典序最小字符串 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以完成以下行为&#xff1a; 选择 s 的任一非空子字符串&#xff0c;可能是整个字符串&#xff0c;接着将字符串中的每一个字符替换为英文字母表中的前…

视频技术朝着8K超高清方向发展,安防监控领域将迎来怎样变化?

一、背景 随着科技的日新月异&#xff0c;视频技术已逐渐成为我们日常生活中不可或缺的一部分。从娱乐、教育到安全监控&#xff0c;视频技术无处不在&#xff0c;并以其独特的方式影响着我们的生活方式。本文将探讨视频技术的发展趋势&#xff0c;并重点关注其在监控领域的应…

【ai】李沐 动手深度学学v2 环境安装:anaconda3、pycharm、d2

cuda-toolkit cuda_12.5.0_windows_network.exe 官方课程网站 第二版资源下载release版本 pycharm版本 李沐 【动手学深度学习v2 PyTorch版】 课程笔记 CUDA 选择11, 实际下载 12.5.0

C++里的异同点

文章目录 1. 可以在构造函数和析构函数中调用虚函数吗&#xff1f;2. 类对象的内存模型&#xff08;内存布局&#xff09;3. 菱形继承问题&#xff08;钻石问题&#xff09;如何解决&#xff1f;4. 堆和栈内存区别5. static_cast和dynamic_cast异同6. 智能指针的实现机制7. 移动…

无需劳师动众,让石油化工DCS集散控制系统轻松实现无线传输!

石油化工中,为了保证较高的可靠性和安全性,大量使用的是DCS集散控制系统。与FCS现场总线的“现场采集,转换为数字信号来集中传输”不同,DCS系统为了避免由于线缆断裂或者节点问题导致整个控制系统失灵,采用“分散传输,集中采集”的方式,即每个传感器通过4-20mA的模拟量通…

custom_evaluator.py

import numpy as np from pycocotools.cocoeval import COCOeval# 自定义COCOeval类&#xff0c;继承自COCOeval class CustomCOCOeval(COCOeval):# 重写computeIoU方法def computeIoU(self, imgId, catId):p self.paramsif p.useCats:gt self._gts[imgId, catId]dt self._d…

Linux——进程练习

1、使用进程知识点&#xff0c;尝试完成如下功能: 输入n&#xff0c; 动态生成n个子进程&#xff0c;并打印输出各自进程的pid号。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h>#include <sys/types.h>in…

Linux下创建Oracle数据库的实例

1.安装前准备 1.1.安装前准备一 安装前准备信息 数据库版本&#xff1a;Oracle19.16.0.0.0Linux版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo)主机名&#xff1a;ace-test-84IP&#xff1a;10.10.10.212SID&#xff1a;dcpfareintservice_name&#x…

电机应用相关名词介绍

1.电机转速 定义&#xff1a;电机转速指电机工作时旋转的速度&#xff0c;是衡量电机性能的重要指标之一。 单位&#xff1a; 每分钟转数&#xff08;RPM&#xff09;&#xff1a;即Revolutions Per Minute&#xff0c;表示电机每分钟旋转的圈数。 每秒转数&#xff08;RPS…

【小工具】Unity批量删除物体上引用丢失的脚本

介绍 Unity批量删除物体上引用丢失的脚本 使用场景 当在外部导入资源时会造成物体上挂载的脚本引用丢失&#xff0c;一个个删除比较麻烦&#xff0c;可以借用这个工具快速实现 工具原理 继承EditorWindow绘制一个自定义的编辑器窗口 加载Assets目录下所有预制体 获取其所有…

畜牧机械5G智能制造工厂物联数字孪生平台,推进制造业数字化转型

畜牧机械5G智能制造工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。畜牧机械5G智能制造工厂物联数字孪生平台&#xff0c;是近年来制造业数字化转型的杰出代表。工业物联数字孪生平台平台集成了物联网、大数据、云计算和人工智能等先进技术&#xff0c;通过高速、低延…