面试题汇总——设计模式
发布人: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 List children;
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

