重学Java设计模式
设计模式是软件开发中经验总结和重用的基础,为解决常见问题提供了解决方案。Java作为一种常用的编程语言,也有许多常用的设计模式可以用来提高代码的可读性、可维护性和可扩展性。本文将介绍几种常见的Java设计模式,并提供相应的代码示例。
单例模式(Singleton Pattern)单例模式确保一个类只有一个例子,并提供一个全球访问点。在实际应用中,我们经常需要使用单例模式来管理资源,如数据库连接池、线程池等。
以下是一个简单的单例模式代码示例:
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; }}
在上述代码中,私有结构方法阻止了直接实例化,而静态方法getInstance()
通过双重检查锁(double-checked locking)实例的唯一性得到了保证。
工厂模式用于创建对象而不暴露对象的创建逻辑。它通过定义工厂类来创建对象,并返回其接口或父类。这样,我们就可以统一管理对象的创建过程,减少耦合。
以下是一个简单的工厂模式代码示例:
public interface Shape { void draw();}public class Rectangle implements Shape { @Override public void draw() { System.out.println("画一个矩形"); }}public class Circle implements Shape { @Override public void draw() { System.out.println("画一个圆形"); }}public class ShapeFactory { public static Shape getShape(String shapeType) { if (shapeType == null) { return null; } if (shapeType.equalsIgnoreCase("Rectangle")) { return new Rectangle(); } else if (shapeType.equalsIgnoreCase("Circle")) { return new Circle(); } return null; }}
在上述代码中,Shape
接口定义了draw()
方法,Rectangle
和Circle
类实现了界面,并重写了它draw()
方法。ShapeFactory
根据传入的类别shapeType
创建相应对象的参数。
观察者模式定义了对象之间的一对多依赖关系,当对象状态发生变化时,所有依赖者都会被通知并自动更新。
以下是观察者模式的简单代码示例:
import java.util.ArrayList;import java.util.List;public interface Observer { void update();}public class ConcreteObserver implements Observer { @Override public void update() { System.out.println("收到通知,更新状态"); }}public class Subject { private List<Observer> observers = new ArrayList<>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } }}
在上述代码中,Observer
接口定义了update()
方法,ConcreteObserver
类实现了界面,并重写了它update()
方法。Subject
类维护观察者列表,并提供增加、删除和通知观察者的方法。
以下是本文介绍的三种设计模式的类图:
classDiagram class Singleton { - instance: Singleton + getInstance(): Singleton } class Shape { + draw() } class Rectangle { + draw() } class Circle { + draw() } class ShapeFactory { + getShape(shapeType: String): Shape } class Observer { + update() } class ConcreteObserver { + update() } class Subject { - observers: List<Observer> + attach(observer: Observer) + detach(observer: Observer) + notifyObservers() } Singleton -->|创建实例| Singleton
![](/images/780-200-2.jpg)