设计模式是在软件设计中发现、研究和应用的一种有效方法。设计模式并不直接转化成代码,而是提供了解决某一问题的框架。下面介绍一些常用的设计模式以及对应的Java代码示例:
1. 单例模式:确保某一个类只有一个实例,同时提供一个访问它的全局访问点。
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
2. 工厂模式:提供一个创建对象的接口,允许将实例化的逻辑延迟到子类进行。
abstract class Product {
}
class ProductA extends Product {
}
class ProductB extends Product {
}abstract class Factory {abstract Product createProduct();
}class FactoryA extends Factory {Product createProduct() {return new ProductA();}
}class FactoryB extends Factory {Product createProduct() {return new ProductB();}
}
3. 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
import java.util.ArrayList;
import java.util.List;interface Observer {void update();
}class ConcreteObserver implements Observer {public void update() {}
}interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update();}}
}
4. 建造者模式:将一个复杂对象的构建与它的表现分离,以使得同样的构建过程可以创建不同的表现。
class Product {private String partA;private String partB;// ... 省略 getter 和 setter 方法 ...
}abstract class Builder {protected Product product = new Product();public abstract void buildPartA();public abstract void buildPartB();public Product getProduct() {return product;}
}class ConcreteBuilder extends Builder {public void buildPartA() {product.setPartA("A");}public void buildPartB() {product.setPartB("B");}
}class Director {public void construct(Builder builder) {builder.buildPartA();builder.buildPartB();}
}
5. 适配器模式:将一个类的接口转换成用户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以脱离。
interface Target {void request();
}class Adaptee {void specificRequest() {// 实现具体功能}
}class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}
}
6. 策略模式:定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。
interface Strategy {void algorithmInterface();
}class ConcreteStrategyA implements Strategy {public void algorithmInterface() {// 具体算法 A}
}class ConcreteStrategyB implements Strategy {public void algorithmInterface() {// 具体算法 B}
}class Context {Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void contextInterface() {strategy.algorithmInterface();}
}