Java设计模式
引言
设计模式是软件工程中广泛应用的一种解决问题的方法和思想。通过使用已被证明有效的设计模式,开发人员可以提高代码的可重用性、可维护性和可扩展性。Java作为一种强大的编程语言,为开发人员提供了丰富的设计模式库。本文将介绍几种常见的Java设计模式,并提供相应的代码示例。
1. 单例模式
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。常见的应用场景包括日志记录器、数据库连接池和线程池。
代码示例:
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造方法,防止外部实例化
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
单例模式的应用
单例模式的一个常见应用是在多线程环境下保证只有一个实例被创建。通过使用双重检查锁定,可以在多线程环境下实现线程安全的单例模式。
public class ThreadSafeSingleton {
private static volatile ThreadSafeSingleton instance; // 使用volatile关键字保证可见性和有序性
private ThreadSafeSingleton() {
// 私有构造方法,防止外部实例化
}
public static ThreadSafeSingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
}
2. 工厂模式
工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但将对象的实际创建延迟到子类中。工厂模式可以隐藏对象的创建逻辑,并提供一个统一的接口来创建对象。
代码示例:
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle::draw()");
}
}
public class ShapeFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
工厂模式的应用
工厂模式可以根据不同的输入参数来创建不同的对象,实现了对象的创建和使用的解耦。通过工厂模式,可以轻松地添加新的对象类型,而不需要修改现有的代码。
3. 观察者模式
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。
代码示例:
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
}
}
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Octal String: " +