在Java面试中,设计模式是一个重要的知识点,通常涉及以下方面:
创建型模式
工厂模式
作用:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
优点:增加系统的可维护性和可扩展性。
缺点:产品修改时,工厂类也需要修改。
抽象工厂模式
作用:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
优点:当产品类被设计成一起工作时,有良好的维护性。
缺点:产品类扩展困难。
单例模式
作用:确保一个类只有一个实例,并提供一个全局访问点。
特点:
单例类只能有一个实例。
必须自己创建自己的唯一实例。
必须给所有其他对象提供这一实例。
建造者模式
作用:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
结构型模式
适配器模式
作用:将一个类的接口转换成客户端所期望的另一个接口。
优点:使得原本由于接口不兼容而不能一起工作的类能够一起工作。
装饰器模式
作用:动态地给一个对象添加一些额外的职责。
优点:不需要修改原有的类,即可扩展其功能。
代理模式
作用:为其他对象提供一个代理以控制对这个对象的访问。
优点:可以控制访问、记录日志、延迟加载等。
桥接模式
作用:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
行为型模式
策略模式
作用:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。
优点:避免使用多重条件选择语句。
观察者模式
作用:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知并被自动更新。
优点:降低代码间的耦合度。
命令模式
作用:将请求封装成对象,从而使你可以用不同的请求对客户进行参数化。
优点:解耦请求者与接收者。
迭代器模式
作用:提供一种方法顺序访问一个聚合对象中各个元素,而又无需暴露该对象的内部表示。
优点:支持对聚合对象的多种遍历方式。
设计原则
开闭原则:
对扩展开放,对修改关闭。
迪米特法则:
一个对象应该对其他对象保持最少的了解。
合成复用原则:
尽量使用合成/聚合的方式,而不是使用继承。
示例代码
单例模式(线程安全)
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;
}
}
适配器模式
// 目标接口
interface Target {
void request();
}
// 适配者类
class Adaptee {
void specificRequest() {
System.out.println("Called specificRequest()");
}
}
// 适配器类
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
面试时,面试官可能会要求解释上述设计模式的概念、用途、优点和缺点,甚至要求用Java代码实现。掌握这些设计模式及其应用场景,可以帮助你在面试中展示出对Java编程的深入理解和良好的软件设计能力