设计模式(Design Patterns)是面向对象设计中的一种重要技术,是解决常见软件设计问题的通用方案。它们基于对大量软件开发经验的总结和提炼,能够帮助开发者高效、优雅地解决复杂系统中的问题。
本文将介绍常见的设计模式,重点讨论如何在 Java 中应用这些模式,帮助你更好地理解并实践这些设计理念。
设计模式的分类
设计模式通常分为三大类:
- 创建型模式(Creational Patterns):负责对象创建的模式,关注如何创建对象。
- 结构型模式(Structural Patterns):描述对象和类如何组合,关注如何组织系统的各个部分。
- 行为型模式(Behavioral Patterns):描述对象之间的交互和职责分配,关注对象之间的行为。
一、创建型模式
1.1 单例模式(Singleton Pattern)
定义:确保一个类只有一个实例,并提供全局访问点。
应用场景:
- 适用于数据库连接池、日志管理器、配置管理等,确保整个系统只有一个实例。
Java 示例:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
分析:
- 双重检查锁定(Double-Checked Locking)方式确保线程安全且提高性能。
1.2 工厂方法模式(Factory Method Pattern)
定义:定义一个创建对象的接口,但由子类决定实例化哪个类。
应用场景:
- 当系统不知道它需要哪个类的实例,或者希望将实例化的过程推迟到子类中时。
Java 示例:
public interface AnimalFactory {
Animal createAnimal();
}
public class DogFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
public class CatFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
1.3 抽象工厂模式(Abstract Factory Pattern)
定义:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。
应用场景:
- 当一个系统需要处理多个产品族,并且每个产品族中的对象具有不同的具体实现时。
Java 示例:
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
public class WinFactory implements GUIFactory {
@Override
public Button createButton() {
return new WinButton();
}
@Override
public Checkbox createCheckbox() {
return new WinCheckbox();
}
}
1.4 原型模式(Prototype Pattern)
定义:通过复制现有的实例来创建新对象,而不是通过 new 操作符来实例化。
应用场景:
- 对象的创建开销较大时,或者依赖于复杂的构造过程时,可以使用原型模式进行对象复制。
Java 示例:
public interface Prototype extends Cloneable {
Prototype clone() throws CloneNotSupportedException;
}
public class ConcretePrototype implements Prototype {
private String name;
public ConcretePrototype(String name) {
this.name = name;
}
@Override
public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
}
1.5 建造者模式(Builder Pattern)
定义:将一个复杂对象的构建过程抽象出来,使得同样的构建过程可以创建不同的表示。
应用场景:
- 适用于复杂的对象构建,尤其是当对象的构建过程需要多个步骤时。
Java 示例:
public class Computer {
private String CPU;
private String GPU;
private String RAM;
public Computer(String CPU, String GPU, String RAM) {
this.CPU = CPU;
this.GPU = GPU;
this.RAM = RAM;
}
@Override
public String toString() {
return "Computer [CPU=" + CPU + ", GPU=" + GPU + ", RAM=" + RAM + "]";
}
}
二、结构型模式
2.1 适配器模式(Adapter Pattern)
定义:通过一个适配器类,将一个接口转换成客户期望的另一个接口。
应用场景:
- 当系统的类和客户需要的接口不兼容时,使用适配器模式将它们兼容。
Java 示例:
public class Adaptee {
public void specificRequest() {
System.out.println("Specific request");
}
}
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
2.2 装饰器模式(Decorator Pattern)
定义:动态地给一个对象添加额外的职责,装饰器模式比生成子类更为灵活。
应用场景:
- 当你需要为某个对象添加额外功能,而又不希望修改原始类时,使用装饰器模式。
Java 示例:
public interface Coffee {
double cost();
}
public class SimpleCoffee implements Coffee {
@Override
public double cost() {
return 5.0;
}
}
public class MilkDecorator implements Coffee {
private Coffee coffee;
public MilkDecorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public double cost() {
return coffee.cost() + 1.5;
}
}
2.3 享元模式(Flyweight Pattern)
定义:使用共享对象来有效支持大量细粒度对象的复用。
应用场景:
- 当大量对象共享某些数据时,使用享元模式减少内存开销。
Java 示例:
public class ConcreteCharacter implements Character {
private char character;
public ConcreteCharacter(char character) {
this.character = character;
}
@Override
public void display() {
System.out.println("Displaying character: " + character);
}
}
2.4 外观模式(Facade Pattern)
定义:为复杂的子系统提供一个统一的接口,简化客户端的操作。
应用场景:
- 当系统具有复杂的子系统时,外观模式为外部提供一个简化的接口。
Java 示例:
public class ComputerFacade {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
public ComputerFacade() {
cpu = new CPU();
memory = new Memory();
hardDrive = new HardDrive();
}
public void startComputer() {
cpu.freeze();
memory.load();
hardDrive.read();
cpu.jump();
}
}
三、行为型模式
3.1 策略模式(Strategy Pattern)
定义:定义一系列算法,将每个算法封装起来,使它们可以互相替换。
应用场景:
- 当你有多种算法可以选择时,使用策略模式动态选择其中一个算法。
Java 示例:
public 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 ShoppingCart {
private PaymentStrategy paymentStrategy;
public ShoppingCart(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
3.2 模板方法模式(Template Method Pattern)
定义:定义一个操作中的算法骨架,而将一些步骤的实现延迟到子类中。
应用场景:
- 当你有一个固定的算法框架,但是某些步骤可能需要在子类中提供不同的实现时。
Java 示例:
public abstract class AbstractClass {
public final void templateMethod() {
step1();
step2();
}
protected abstract void step1();
protected abstract void step2();
}
public class ConcreteClass extends AbstractClass {
@Override
protected void step1() {
System.out.println("Step 1 implemented.");
}
@Override
protected void step2() {
System.out.println("Step 2 implemented.");
}
}
3.3 观察者模式(Observer Pattern)
定义:当一个对象的状态发生改变时,所有依赖于它的对象都会自动更新。
应用场景:
- 当一个对象的变化需要通知其他对象时,使用观察者模式。
Java 示例
:
import java.util.ArrayList;
import java.util.List;
public interface Observer {
void update(String message);
}
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
public class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
结论
设计模式是解决软件设计中的常见问题的强大工具,能帮助开发者写出更加高效、易维护的代码。掌握设计模式不仅能够帮助你提升编程技能,还能让你在面对复杂问题时更加得心应手。
2万+

被折叠的 条评论
为什么被折叠?



