在Java架构中,设计模式是解决特定问题的成熟解决方案,它们可以帮助设计更加清晰、灵活和可维护的代码。以下是五种常用的设计模式,它们在不同的架构场景中的应用:

1. 单例模式(Singleton)

使用场景:当系统中需要确保某个类有且只有一个实例,并且需要全局访问点时,例如,配置管理类或连接池。

架构应用:在多数应用程序中,特别是Web应用中,用于数据库连接池、线程池的管理或配置设置等。

代码示例

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2. 工厂方法模式(Factory Method)

使用场景:当存在一个超类,并有多个子类,并且在运行时想决定使用哪个子类时。例如,不同类型的支付方式处理。

架构应用:在需要灵活地加入新类型对象而不影响客户端的系统中。如在电商系统中,根据不同的支付方式生成不同的支付处理对象。

代码示例

public interface Payment {
    void pay();
}

public class CreditCardPayment implements Payment {
    @Override
    public void pay() {
        System.out.println("Paying with credit card.");
    }
}

public class PaymentFactory {
    public static Payment getPayment(String paymentType){
        if ("CREDIT".equals(paymentType)) {
            return new CreditCardPayment();
        } else {
            throw new IllegalArgumentException("Unknown payment type");
        }
    }
}

3. 建造者模式(Builder)

使用场景:用于构造一个复杂对象,同时避免构造函数过多。例如,创建一个包含多个可选参数的对象。

架构应用:在需要生成复杂对象的系统中,如文档编辑器中构建复杂文档,或者在RESTful API中构造复杂的响应对象。

代码示例

public class Product {
    private final String partA;
    private final String partB;

    private Product(Builder builder) {
        this.partA = builder.partA;
        this.partB = builder.partB;
    }

    public static class Builder {
        private String partA;
        private String partB;

        public Builder partA(String partA) {
            this.partA = partA;
            return this;
        }

        public Builder partB(String partB) {
            this.partB = partB;
            return this;
        }

        public Product build() {
            return new Product(this);
        }
    }
}

4. 观察者模式(Observer)

使用场景:当一个对象状态的改变需要自动通知其他对象时。例如,用户界面元素自动更新。

架构应用:在事件驱动系统中,如GUI工具包或消息处理系统。

代码示例

import java.util.ArrayList;
import java.util.List;

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

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

public interface Observer {
    void update();
}

public class ConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("Observer notified");
    }
}

5. 策略模式(Strategy)

使用场景:当你想使用不同的算法或策略来完成某个特定任务,同时希望能够在运行时更改算法或策略时。例如,不同的排序或压缩算法。

架构应用:在需要根据不同条件执行不同逻辑的系统中,如文本渲染器中根据用户的选择使用不同的渲染策略。

代码示例

public interface Strategy {
    void execute();
}

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

public class Context {
    private Strategy strategy;

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

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

对于图片解释,由于当前环境不支持图形化内容直接显示,建议查阅相关设计模式的文献或在线资源,这些通常包含各种设计模式的UML类图和序列图,这些图形化内容能帮助更好地理解各个设计模式的结构和工作原理。