当前位置: 面试刷题>> 你在项目中使用了哪些设计模式?举例说明你是如何应用的。


在软件开发项目中,设计模式作为解决常见软件设计问题的现成方案,对于提升代码质量、可维护性和可扩展性至关重要。作为一名高级程序员,我在多个项目中灵活运用了多种设计模式,以下是一些典型的应用实例及简要说明。

1. 单例模式(Singleton Pattern)

应用场景:在项目中,我们经常需要确保某个类的实例在全局范围内是唯一的,比如数据库连接池、配置管理类等。

实现方式

public class Singleton {
    // 私有静态实例,防止外部直接new
    private static Singleton instance;

    // 私有构造函数,防止外部实例化
    private Singleton() {}

    // 提供一个全局访问点
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // 示例方法
    public void doSomething() {
        // 实现具体功能
        System.out.println("Doing something...");
    }
}

优化:为了提升性能,可以使用双重检查锁定(Double-Checked Locking)或静态内部类等方式来避免每次调用getInstance都进行同步。

2. 工厂模式(Factory Pattern)

应用场景:当需要创建多个具有共同父类的对象,但具体创建哪个子类对象由运行时条件决定时,可以使用工厂模式。

实现方式

interface Product {
    void use();
}

class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductA");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductB");
    }
}

class ProductFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 使用
Product product = ProductFactory.createProduct("A");
product.use();

3. 观察者模式(Observer Pattern)

应用场景:当一个对象(主题)的状态发生变化时,所有依赖于它的对象(观察者)都会得到通知并自动更新。

实现方式(简化版):

interface Observer {
    void update(String message);
}

class ConcreteObserver implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Received message: " + message);
    }
}

class Subject {
    List<Observer> observers = new ArrayList<>();

    void registerObserver(Observer o) {
        observers.add(o);
    }

    void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

// 使用
Subject subject = new Subject();
Observer observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.notifyObservers("Hello, Observers!");

4. 策略模式(Strategy Pattern)

应用场景:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。此模式让算法的变化独立于使用算法的客户。

实现方式

interface Strategy {
    void execute();
}

class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing strategy A");
    }
}

class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing strategy B");
    }
}

class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

// 使用
Context context = new Context(new ConcreteStrategyA());
context.executeStrategy();
context.setStrategy(new ConcreteStrategyB());
context.executeStrategy();

总结

以上设计模式的应用实例展示了它们如何在不同场景下解决特定问题。作为高级程序员,我深知设计模式并非银弹,而是需要根据项目实际情况灵活选择和调整。在码小课网站上,我分享了许多关于设计模式深入解析的文章和实战案例,旨在帮助更多开发者掌握这些强大的工具,提升软件设计水平。

推荐面试题