JAVA开发工程师面试题设计模式

本文介绍了设计模式中的七大基本原则,并详细探讨了创建型模式中的单例模式、工厂模式、建造者模式及原型模式。通过具体实例讲解了每种模式的作用、应用场景及实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


设计模式的原则

1、单一职责原则
2、开闭原则
3、里氏代换原则
4、依赖倒转原则
5、接口隔离原则
6、合成/聚合复用原则
7、迪米特法则

一、创建型模式

1、单列模式

(1)核心作用

– 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要 比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动 时直接产生一个单例对象,然后永久驻留内存的方式来解决
– 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计 一个单例类,负责所有数据表的映射处理

(2)应用场景

-Windows的Task Manager(任务管理器)就是很典型的单例模式
– windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
– 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。
– 网站的计数器,一般也是采用单例模式实现,否则难以同步。
– 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作 ,否则内容不好追加。
– 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
– 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
– Application 也是单例的典型应用(Servlet编程中会涉及到) – 在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理
– 在servlet编程中,每个Servlet也是单例 – 在spring MVC框架/struts1框架中,控制器对象也是单例

(3)常见的五种单例模式实现方式
饿汉式
/**
 * 测试饿汉模式单例模式
 * 线程安全,调用效率高。 但是,不能延时加载。
 * @author  
 * 
 * */
public class SingletonDemo1 {
	//类初始化时,立即加载这个对象(没有延迟加载的优势),加载类时,线程安全
	private static SingletonDemo1 instance =new SingletonDemo1();
	//私有构造器
	private SingletonDemo1(){}
	//方法没有同步,调用效率高
	public static SingletonDemo1 getInstance(){
		return instance;
	}
}
懒汉式
/**
 * 测试懒汉式单例模式
 * 线程安全,调用效率不高。 但是,可以延时加载。  
 * 
 * */
public class SingletonDemo2 {
	//类初始化时,不初始化这个对象(延迟加载,真正用的时候再创建)
	private static SingletonDemo2 istance ;
	//私有构造器
	private SingletonDemo2(){}
	//方法同步,调用效率低
	public static synchronized SingletonDemo2 getInstance(){
		if( istance == null){
			istance = new SingletonDemo2();
		}
		return istance;
	}
	
}

双重检查锁式模式
/**
 * 测试懒汉式单例模式
 * @author  
 * 
 * */
public class SingletonDemo3 {
	//[1]对象锁
	private static SingletonDemo3 intance ;
	
	public static  SingletonDemo3 getInstance(){
		if( intance == null){
			 SingletonDemo3 sc;
			 // synchronized方法锁
			 synchronized(SingletonDemo3.class){
				 sc = intance;
				 if(sc == null){
					 synchronized(SingletonDemo3.class){
						 if(sc == null){
							 sc = new SingletonDemo3();
						 }
					 }
					 intance =sc;
				 }
			 }
		}
		return intance;
	}
	private SingletonDemo3(){}
	
}
静态内部类式
枚举单例

2、工厂模式

(1)作用

实现了创建者和调用者的分离。

(2)核心本质

– 实例化对象,用工厂方法代替new操作。
– 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实 现类解耦

(3)3种方式
简单工厂模式

用来生产同一等级结构中的任意产品。

工厂方法模式

用来生产同一等级结构中的固定产品。

抽象工厂模式

用来生产不同产品族的全部产品。

应用场景

– JDK中Calendar的getInstance方法
– JDBC中Connection对象的获取
– Hibernate中SessionFactory创建Session
– spring中IOC容器创建管理bean对象
– XML解析时的DocumentBuilderFactory创建解析器对象
– 反射中Class对象的newInstance()

3、建造者模式

(1)本质

– 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构 造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用

(2)场景

– StringBuilder类的append方法
– SQL中的PreparedStatement
– JDOM中,DomBuilder、SAXBuilder

4、原型模式

(1)场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值