面试题汇总——设计模式
发布人:shili8
发布时间:2025-03-13 07:13
阅读次数:0
**面试题汇总——设计模式**
设计模式是软件设计中经常使用的解决方案,它们提供了一种通用的、可重用且易于维护的方法来解决特定问题。以下是一些常见的设计模式及其相关面试题:
###1. 单例模式**定义:**
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。
**面试题:**
*请描述一下单例模式的优缺点。
* 如何实现一个线程安全的单例模式?
* 单例模式在什么情况下使用?
**示例代码:**
javapublic class Singleton { // 私有构造函数,防止外部直接创建实例 private Singleton() {} // 静态私有变量,保存唯一实例 private static Singleton instance = null; // 公共方法,获取唯一实例 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
###2. 工厂模式**定义:**
工厂模式是一种创建型设计模式,它提供了一个用于创建对象的接口,而不需要暴露具体类。
**面试题:**
*请描述一下工厂模式的优缺点。
* 如何实现一个简单的工厂模式?
* 工厂模式在什么情况下使用?
**示例代码:**
javapublic abstract class Animal { public abstract void sound(); } public class Dog extends Animal { @Override public void sound() { System.out.println("Woof!"); } } public class Cat extends Animal { @Override public void sound() { System.out.println("Meow!"); } } public class AnimalFactory { public static Animal createAnimal(String type) { if (type.equals("dog")) { return new Dog(); } else if (type.equals("cat")) { return new Cat(); } else { throw new RuntimeException("Invalid animal type"); } } }
###3. 观察者模式**定义:**
观察者模式是一种行为型设计模式,它允许一个对象(被观察者)在状态变化时通知其他对象(观察者)。
**面试题:**
*请描述一下观察者模式的优缺点。
* 如何实现一个简单的观察者模式?
* 观察者模式在什么情况下使用?
**示例代码:**
javapublic interface Observer { void update(String message); } public class WeatherStation implements Observer { private String weather; public void setWeather(String weather) { this.weather = weather; notifyObservers(); } @Override public void update(String message) { System.out.println("Received weather update: " + message); } } public class ForecastDisplay implements Observer { @Override public void update(String message) { System.out.println("Forecast updated: " + message); } }
###4. 策略模式**定义:**
策略模式是一种行为型设计模式,它允许在一个类中使用多种算法或策略。
**面试题:**
*请描述一下策略模式的优缺点。
* 如何实现一个简单的策略模式?
* 策略模式在什么情况下使用?
**示例代码:**
javapublic interface PaymentStrategy { void pay(int amount); } public class CreditCardPayment implements PaymentStrategy { @Override public void pay(int amount) { System.out.println("Paid " + amount + " using credit card"); } } public class PayPalPayment implements PaymentStrategy { @Override public void pay(int amount) { System.out.println("Paid " + amount + " using PayPal"); } }
###5. 模板方法模式**定义:**
模板方法模式是一种行为型设计模式,它允许在一个类中定义一个算法的骨架,而子类可以提供具体实现。
**面试题:**
*请描述一下模板方法模式的优缺点。
* 如何实现一个简单的模板方法模式?
* 模板方法模式在什么情况下使用?
**示例代码:**
javapublic abstract class Coffee { public final void make() { boilWater(); brewCoffee(); pourInCup(); if (hasMilk()) { addMilk(); } } private void boilWater() { System.out.println("Boiling water..."); } private void brewCoffee() { System.out.println("Brewing coffee..."); } private void pourInCup() { System.out.println("Pouring coffee in cup..."); } protected abstract boolean hasMilk(); protected abstract void addMilk(); }
###6. 适配器模式**定义:**
适配器模式是一种结构型设计模式,它允许两个不兼容的接口之间进行通信。
**面试题:**
*请描述一下适配器模式的优缺点。
* 如何实现一个简单的适配器模式?
* 适配器模式在什么情况下使用?
**示例代码:**
javapublic interface Duck { void quack(); } public class Turkey { public void gobble() { System.out.println("Gobble!"); } } public class TurkeyAdapter implements Duck { private Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public void quack() { turkey.gobble(); } }
###7. 装饰器模式**定义:**
装饰器模式是一种结构型设计模式,它允许动态地添加或修改一个对象的行为。
**面试题:**
*请描述一下装饰器模式的优缺点。
* 如何实现一个简单的装饰器模式?
* 装饰器模式在什么情况下使用?
**示例代码:**
javapublic interface Coffee { void make(); } public class SimpleCoffee implements Coffee { @Override public void make() { System.out.println("Making simple coffee..."); } } public class MilkDecorator implements Coffee { private Coffee coffee; public MilkDecorator(Coffee coffee) { this.coffee = coffee; } @Override public void make() { coffee.make(); addMilk(); } protected abstract void addMilk(); }
###8. 组合模式**定义:**
组合模式是一种结构型设计模式,它允许将对象表示为树状结构。
**面试题:**
*请描述一下组合模式的优缺点。
* 如何实现一个简单的组合模式?
* 组合模式在什么情况下使用?
**示例代码:**
javapublic interface Component { void operation(); } public class Leaf implements Component { @Override public void operation() { System.out.println("Leaf operation..."); } } public class Composite implements Component { private Listchildren; public Composite() { this.children = new ArrayList<>(); } @Override public void operation() { for (Component child : children) { child.operation(); } } public void add(Component component) { children.add(component); } public void remove(Component component) { children.remove(component); } }
###9.代理模式**定义:**
代理模式是一种结构型设计模式,它允许为一个对象提供一个替代的接口。
**面试题:**
*请描述一下代理模式的优缺点。
* 如何实现一个简单的代理模式?
*代理模式在什么情况下使用?
**示例代码:**
javapublic interface Subject { void request(); } public class RealSubject implements Subject { @Override public void request() { System.out.println("Real subject request..."); } } public class ProxySubject implements Subject { private RealSubject realSubject; public ProxySubject(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void request() { preRequest(); realSubject.request(); postRequest(); } protected abstract void preRequest(); protected abstract void postRequest(); }
###10. 外观模式**定义:**
外观模式是一种结构型设计模式,它允许为一个复杂的系统提供一个简单的接口。
**面试题:**
*请描述一下外观模式的优缺点。
* 如何实现一个简单的外观模式?
* 外观模式在什么情况下使用?
**示例代码:**
javapublic interface Light { void on(); } public class Bulb implements Light { @Override public void on() { System.out.println("Bulb is on..."); } } public class Lamp implements Light { private