千锋教育-做有情怀、有良心、有品质的职业教育机构

设计模式是软件开发中常用的一种指导性原则,它可以帮助开发者解决常见的设计问题,并提高代码的可读性、可维护性和可扩展性。在Java开发中,设计模式更是被广泛应用。本文将介绍几种常见的Java设计模式,并通过实际案例进行详细的阐述。

_x000D_
_x000D_
单例模式是一种保证一个类仅有一个实例,并提供一个全局访问点的设计模式。在Java中,单例模式通常通过私有化构造方法、静态变量和静态方法来实现。一个经典的单例模式实现是使用静态变量和双重检查锁定机制来确保线程安全。例如:
_x000D_
`java
_x000D_
public class Singleton {
_x000D_
private static volatile Singleton instance;
_x000D_
private Singleton() {}
_x000D_
public static Singleton getInstance() {
_x000D_
if (instance == null) {
_x000D_
synchronized (Singleton.class) {
_x000D_
if (instance == null) {
_x000D_
instance = new Singleton();
_x000D_
}
_x000D_
}
_x000D_
}
_x000D_
return instance;
_x000D_
}
_x000D_
_x000D_
在这个例子中,getInstance()方法首先检查instance是否为null,如果为null,则使用synchronized关键字加锁,再次检查instance是否为null,然后创建实例。这种方式可以确保在多线程环境下也能正确创建单例对象。_x000D_
_x000D_
工厂模式是一种用来创建对象的设计模式,它将对象的创建过程封装在一个工厂类中,客户端通过工厂类来获取对象,而不需要直接调用对象的构造方法。工厂模式可以根据不同的条件创建不同的对象,提高代码的灵活性和可扩展性。例如:_x000D_
`java_x000D_
public interface Shape {_x000D_
void draw();_x000D_
public class Circle implements Shape {_x000D_
@Override_x000D_
public void draw() {_x000D_
System.out.println("Drawing a circle");_x000D_
}_x000D_
public class Rectangle implements Shape {_x000D_
@Override_x000D_
public void draw() {_x000D_
System.out.println("Drawing a rectangle");_x000D_
}_x000D_
public class ShapeFactory {_x000D_
public Shape createShape(String shapeType) {_x000D_
if ("circle".equalsIgnoreCase(shapeType)) {_x000D_
return new Circle();_x000D_
} else if ("rectangle".equalsIgnoreCase(shapeType)) {_x000D_
return new Rectangle();_x000D_
}_x000D_
return null;_x000D_
}_x000D_
_x000D_
在这个例子中,ShapeFactory根据传入的shapeType参数创建不同的Shape对象,客户端只需要调用createShape()方法即可获取所需的对象,而不需要直接调用Circle或Rectangle的构造方法。
_x000D_
_x000D_
观察者模式是一种对象行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式通常使用java.util.Observable和java.util.Observer接口来实现。例如:
_x000D_
`java
_x000D_
public class Subject extends Observable {
_x000D_
private int data;
_x000D_
public int getData() {
_x000D_
return data;
_x000D_
}
_x000D_
public void setData(int data) {
_x000D_
this.data = data;
_x000D_
setChanged();
_x000D_
notifyObservers();
_x000D_
}
_x000D_
public class Observer implements java.util.Observer {
_x000D_
@Override
_x000D_
public void update(Observable o, Object arg) {
_x000D_
if (o instanceof Subject) {
_x000D_
System.out.println("Data has been changed to: " + ((Subject) o).getData());
_x000D_
}
_x000D_
}
_x000D_
_x000D_
在这个例子中,Subject类继承了Observable类,并在setData()方法中调用setChanged()和notifyObservers()方法来通知观察者对象。Observer类实现了Observer接口,并在update()方法中响应主题对象的状态变化。_x000D_
_x000D_
装饰者模式是一种结构型设计模式,它允许动态地给一个对象添加额外的功能,而无需修改其原始类。在Java中,装饰者模式通常通过继承或组合的方式来实现。例如:_x000D_
`java_x000D_
public interface Shape {_x000D_
void draw();_x000D_
public class Circle implements Shape {_x000D_
@Override_x000D_
public void draw() {_x000D_
System.out.println("Drawing a circle");_x000D_
}_x000D_
public abstract class ShapeDecorator implements Shape {_x000D_
protected Shape decoratedShape;_x000D_
public ShapeDecorator(Shape decoratedShape) {_x000D_
this.decoratedShape = decoratedShape;_x000D_
}_x000D_
@Override_x000D_
public void draw() {_x000D_
decoratedShape.draw();_x000D_
}_x000D_
public class RedShapeDecorator extends ShapeDecorator {_x000D_
public RedShapeDecorator(Shape decoratedShape) {_x000D_
super(decoratedShape);_x000D_
}_x000D_
@Override_x000D_
public void draw() {_x000D_
decoratedShape.draw();_x000D_
setRedBorder(decoratedShape);_x000D_
}_x000D_
private void setRedBorder(Shape decoratedShape) {_x000D_
System.out.println("Border Color: Red");_x000D_
}_x000D_
_x000D_
在这个例子中,Shape接口定义了一个draw()方法,Circle类实现了Shape接口。ShapeDecorator类是一个抽象装饰者类,RedShapeDecorator类继承了ShapeDecorator类,并在draw()方法中添加了额外的功能。
_x000D_
_x000D_
策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。在Java中,策略模式通常通过接口和实现类来实现。例如:
_x000D_
`java
_x000D_
public interface Strategy {
_x000D_
int doOperation(int num1, int num2);
_x000D_
public class AddStrategy implements Strategy {
_x000D_
@Override
_x000D_
public int doOperation(int num1, int num2) {
_x000D_
return num1 + num2;
_x000D_
}
_x000D_
public class SubtractStrategy implements Strategy {
_x000D_
@Override
_x000D_
public int doOperation(int num1, int num2) {
_x000D_
return num1 - num2;
_x000D_
}
_x000D_
public class Context {
_x000D_
private Strategy strategy;
_x000D_
public Context(Strategy strategy) {
_x000D_
this.strategy = strategy;
_x000D_
}
_x000D_
public int executeStrategy(int num1, int num2) {
_x000D_
return strategy.doOperation(num1, num2);
_x000D_
}
_x000D_ _x000D_
在这个例子中,Strategy接口定义了一个doOperation()方法,AddStrategy和SubtractStrategy类实现了Strategy接口。Context类包含一个Strategy对象,并在executeStrategy()方法中调用具体的算法。这样客户端可以根据需要选择不同的算法来执行。
_x000D_
相关推荐