Java面试题——第二篇(设计模式)

news2024/12/26 20:47:20

1. 工厂方法模式

1.1 普通工厂模式

建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
在这里插入图片描述

1.2 抽象工厂模式

抽象多个工厂类,提高工厂的可扩展性

定义抽象工厂接口

public interface DeviceFactory {  
    Phone createPhone();  
    Computer createComputer();  
}

实现具体工厂类

// 华为工厂  
public class HuaweiFactory implements DeviceFactory {  
    @Override  
    public Phone createPhone() {  
        return new HuaweiPhone();  
    }  
    @Override  
    public Computer createComputer() {  
        // 假设华为工厂目前只生产手机  
        return null;  
    }  
}  
// 苹果工厂  
public class AppleFactory implements DeviceFactory {  
    @Override  
    public Phone createPhone() {  
        return new iPhone();  
    }  
  
    @Override  
    public Computer createComputer() {  
        return new MacComputer();  
    }  
}

客户端使用

public class Client {  
    public static void main(String[] args) {  
        // 使用华为工厂  
        DeviceFactory huaweiFactory = new HuaweiFactory();  
        Phone huaweiPhone = huaweiFactory.createPhone();  
        huaweiPhone.call();  
  
        // 使用苹果工厂  
        DeviceFactory appleFactory = new AppleFactory();  
        Phone iphone = appleFactory.createPhone();  
        iphone.call();  
        Computer macComputer = appleFactory.createComputer();  
        macComputer.surfInternet();  
    }  
}

2. 单例模式

保证在一个JVM中,该对象只有一个实例存在。

使用场景:

  • 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
  • 省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
  • 有些例如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统就会乱掉,所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
  1. 饿汉式:类初始化时创建单例,线程安全,适用于单例占内存小的场景。
public class Singleton{
 
 private static Singleton instance = new Singleton();
 
 private Singleton(){}
 
 public static Singleton newInstance(){
  return instance;
 }
}
  1. 懒汉式:需要创建单例实例的时候在创建,需要考虑线程安全
public class Singleton{

 private static Singleton instance = null;
 
 private Singleton(){}
 
 public static synchronized Singleton newInstance(){
  if(null == instance){
    instance = new Singleton();
  }
  return instance;
 }
}
  1. 双重校验锁定

解决问题:假如两个线程A执行了if(null == instance)语句,会认为单例对象没有创建,此时线程切到B也执行了同样语句,B也认为单例对象没有创建,然后两个线程依次执行同步代码块,分别创建了一个对象。

public class Singleton {  
	// 持有私有静态实例,防止被引用
    private static volatile Singleton instance;  
    // 私有构造方法,防止被实例化
    private Singleton() {}  

    //静态工厂方法,创建实例
    public static Singleton getInstance() {  
        if (instance == null) {  
            synchronized (Singleton.class) {  
                if (instance == null) {  
                    instance = new Singleton();  
                }  
            }  
        }  
        return instance;  
    }  
}
  1. 静态内部类方法:可以同时保证延迟加载和线程安全
public class Singleton {  
    private Singleton() {}  
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}

3. 原型模式

对一个原型对象进行复制、克隆产生类似的新对象:将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。

  • 核心: 他的核心是原型类Prototype,需要实现cloneable接口,和重写Object类中的clone方法。
  • 作用:使用原型模式创建对象比直接new一个对象在性能上好得多,因为Object类的clone方法是一个本地方法,他直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

4. 适配器模式

为了增强接口的兼容性,将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配造成的类的兼容性问题。

4.1类的适配器模式

示例:有一个source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,将Source功能扩展到Targetable里。
在这里插入图片描述

4.2 对象的适配器模式

当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例方法即可。
在这里插入图片描述

4.3 接口的适配器模式

使用场景:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类时候,继承抽象类即可。
在这里插入图片描述

5. 装饰者模式

给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
在这里插入图片描述

6. 代理模式(动态代理、静态代理)

持有被代理类的实例,进行操作前后控制。用的最多的模式。
在这里插入图片描述

7. 外观模式

集合所有操作到一个类。
在这里插入图片描述

8. 桥接模式

把事物和其具体实现分开,使得他们可以各自独立变化。

9. 组合模式

10.享元模式(共享池、数据库连接池)

享元模式的主要目的是实现对象的共享,即共享池。

11.策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使得他们可以相互变化,且算法的变化不会影
响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口。

在这里插入图片描述

12. 模版方法模式(抽象方法作为骨架,具体逻辑让那个子类实现)

定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。完成公共动作和特殊动作的分离。
在这里插入图片描述

13.观察者模式(发布-订阅模式)

当一个对象变化时,其他依赖该对象的对象都会收到通知,并且随着变化!

14. 迭代器模式(遍历集合)

迭代器模式就是顺序访问聚集中的对象

15. 责任链模式(多任务形成一条链,请求在链上传递)

有多个对象,每个对象持有下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一个对象决定处理该请求。但是发出者并不清楚到底最终哪个对象会处理该请求。所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。

16. 命令模式(实现请求和执行的解耦)

命令模式目的就是达到命令的发出者和执行者之间的解耦。

17. 备忘录模式(保存和恢复对象状态)

主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象。

18.状态模式(对象状态改变时改变其行为)

当对象的状态改变时,同时改变其行为。
在这里插入图片描述

19. 建造者模式

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。

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

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

相关文章

【工具插件类教学】vHierarchy 2工具编辑器扩展使用

目录 一、下载导入 二、使用介绍 1.便捷小工具 a.图标和颜色Icons and colors b.对象组件缩略图Component minimap c.层级线展示Hierarchy lines d.极简模式Minimal mode e.斑马条纹图案Zebra striping f.激活切换Activation toggle 2、快捷键 一、下载导入 资源官方…

Redis系列之Redis Sentinel

概述 Redis主从集群,一主多从模式,包括一个Master节点和多个Slave节点。Master负责数据的读写,Slave节点负责数据的查询。Master上收到的数据变更,会同步到Slave节点上实现数据的同步。通过这种架构实现可以Redis的读写分离&…

U盘文件或目录损坏无法读取?专业恢复策略全解析

U盘困境:文件目录的隐形危机 在日常的数字生活中,U盘作为便捷的数据存储与传输工具,扮演着至关重要的角色。然而,当U盘中的文件或目录突然遭遇损坏,导致无法被正常读取时,这无疑给用户带来了极大的困扰。这…

达梦数据库的系统视图v$cachers

达梦数据库的系统视图v$cachers 达梦数据库的系统视图V$CACHERS的作用是显示缓存中的项信息,在 ini 参数 USE_PLN_POOL !0 时才统计。这个视图帮助数据库管理员监控和分析缓存的使用情况,优化数据库性能。通过查询V$CACHERS视图,可以获取缓存…

DeferredResult 是如何实现异步处理请求的

最近遇到了一个问题,我们的一个接口需要去轮询另一个第三方接口,导致这个接口占用了太多工作线程,这些工作线程长时间 running,我们需要解决这个问题。 于是,我们的方案是:用 DeferredResult 实现接口异步。…

如何用 ChatGPT 提升学术写作:15 个高效提示

在本文,我们详细探讨了如何利用 ChatGPT 提升学术写作的各个方面。我们帮助学术作者通过生成创意点子、构建论证结构、克服写作障碍以及格式化引用,从而显著提升其学术论文的质量。这 15 条提示不仅可以单独使用,还可作为学习的良好范例。 本…

文件解析漏洞复现

一、IIS 6.X 1.在网站目录创建文件夹名为xxx.asp/xxx.asa 文件夹,里面的任意文件都会被当作asp文件执行 创建1.asp 访问 2.ooo.asp.jpg会被当做asp文件执行 创建一个ooo.asp;.jpg 访问 二、IIS 7.X 上传1.jpg文件在网址后/.php可以成功执行 写一个1.jpg文件内容…

CTFHubret2shellcode-入土为安的第十三天

checksec pwn 没有开保护 并且是64位的 放入IDa64 shiftf12 查看字符串 发现没有shell f5查看主函数 read函数,点进去buf 0x010,0x08. buf的地址 因为我们要把buf填充满 然后再让栈进入shellcode的地址 然后再执行shellcode recvuntil 函数会一直读取数据&#…

Vue3 + JS项目配置ESLint Pretter

前言 如果在开发大型项目 同时为多人协作开发 那么 ESLint 在项目中极为重要 在使用 ESLint 的同时 也需要使用 Pretter插件 统一对代码进行格式化 二者相辅相成 缺一不可 1. 安装 VsCode 插件 在 VsCode 插件市场搜索安装 ESLint 和 Pretter 2. 安装依赖 这里直接在 pac…

SOLIDWORKS教育版支持多种快捷键和自定义工具

在工程设计与教育的广阔领域中,SOLIDWORKS作为一款强大的三维CAD设计软件,凭借其直观的操作界面、丰富的功能集以及对学生及教育机构的特别支持,赢得了广泛的认可与好评。其中,SOLIDWORKS教育版不仅继承了专业版的核心功能&#x…

Android Listview notifyDataSetChanged() 不起作用

private ArrayList<Map<String, String>> data new ArrayList<Map<String, String>>(); private ArrayList<Map<String, String>> delivered_data new ArrayList<Map<String, String>>(); 如果直接将arraylist 的数据直接…

人工智能深度学习系列—深度学习损失函数中的Focal Loss解析

文章目录 1. 背景介绍2. Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 在深度学习的目标检测任务中&#xff0c;类别不平衡问题一直是提升模型性能的拦路虎。Focal Loss损失函数应运而生&#xff0c;专为解决这一难题设计。本文将深入探讨Focal Loss的背景、计算方…

面向对象之设计模式,四种内部类,类关系

面向对象 1. 类关系 继承 使用extends表示,类和类单继承,接口和接口多继承,多个逗号隔开 又叫泛化关系 实现 类和接口是多实现关系,多个逗号隔开,通过关键字 implements表示 依赖 一个类中的局部变量 ,保存了另一个类对象 关联 又叫强依赖,一个类中的成员变量,是另一个类对象…

用Babylon.js 滑动屏幕画图形,签字等

介绍 在上篇文章中我们已经了解到了该游戏引擎的基本搭建过程。比如灯光,摄像头,场景、事件监听等。这里我就不做多介绍。运用以上知识点。我们此时做一个小游戏画图。 效果图 源代码 1.先监听事件是否碰撞到了画板 2.然后判断动作,手指按住屏幕,松开屏幕,滑动屏幕。 …

Linux---进程(4)---进程优先级调度切换

目录 进程优先级 进程切换 前期知识补充 进程切换 进程调度 进程优先级 权限是为了解决能不能享受资源的问题&#xff0c;优先级则是为了解决享受资源的顺序的问题。 进程要访问某种资源&#xff0c;就需要用排队的方式&#xff0c;确定享受资源的先后顺序。因为资源是少…

谷粒商城实战笔记-105~107-全文检索-ElasticSearch-入门

文章目录 一&#xff0c;105-全文检索-ElasticSearch-入门-_cat二&#xff0c;106-全文检索-ElasticSearch-入门-put&post新增数据三&#xff0c;107-全文检索-ElasticSearch-入门-get查询数据&乐观锁字段1&#xff0c;过时的乐观锁-version2&#xff0c;Elasticsearch…

深入源码P3C-PMD:启动源码(2)

下面我们开始从启动探寻 PMD 的源码设计。 pmd 的启动类为 PmdCli&#xff0c;作为命令行的启动器&#xff0c; 其依赖 picocli 作为控制台命令框架。 picocli 官网&#xff1a;https://picocli.info/ Command(name "checksum", mixinStandardHelpOptions true, v…

Golang | Leetcode Golang题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; func removeDuplicateLetters(s string) string {left : [26]int{}for _, ch : range s {left[ch-a]}stack : []byte{}inStack : [26]bool{}for i : range s {ch : s[i]if !inStack[ch-a] {for len(stack) > 0 && ch < stack…

谷歌外链的重要性及获取方法!

对于做谷歌seo的人来说&#xff0c;谷歌外链的重要性不言而喻&#xff0c;这是谷歌评估一个网站的重要指标&#xff0c;它们像是网络上的推荐信&#xff0c;可以显著提高你网站的可见度和信誉&#xff0c;这样有利于关键词获取到更好的排名&#xff0c;有作用的外链能显著提升网…

CDO学习

1.备份instie.mdb文件 2.