Java设计模式详解
解决方案
在软件开发中,设计模式是一种经过验证的解决方案,用于解决特定场景下的常见问题。通过使用设计模式,开发者可以提高代码的可维护性、可扩展性和复用性。详细探讨几种常见的Java设计模式,并提供具体的实现代码和多种解决方案思路。
1. 单例模式 (Singleton Pattern)
问题描述
单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要共享资源的场景,例如数据库连接池或日志记录器。
解决方案
以下是几种实现单例模式的方式:
方法一:懒汉式(线程不安全)
java
public class Singleton {
private static Singleton instance;</p>
<pre><code>private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
注意:此方法在多线程环境下可能会创建多个实例。
方法二:懒汉式(线程安全)
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
java
**优化**:可以通过双重检查锁定(Double-Checked Locking)来减少同步开销:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
方法三:饿汉式
java
public class Singleton {
private static final Singleton instance = new Singleton();</p>
<pre><code>private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
优点:线程安全且简单,但实例化时间较早。
方法四:静态内部类
```java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
优点:延迟加载,线程安全。
2. 工厂模式 (Factory Pattern)
问题描述
工厂模式用于创建对象而无需指定具体类。它分为简单工厂模式和抽象工厂模式。
解决方案
简单工厂模式
```java
// 定义产品接口
interface Product {
void show();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void show() {
System.out.println("ConcreteProductA");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void show() {
System.out.println("ConcreteProductB");
}
}
// 工厂类
class Factory {
public static Product getProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
}
return null;
}
}
// 测试
public class Test {
public static void main(String[] args) {
Product product = Factory.getProduct("A");
product.show(); // 输出: ConcreteProductA
}
}
抽象工厂模式
java
// 定义抽象工厂
interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}</p>
<p>// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}</p>
<pre><code>@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
// 产品接口A
interface ProductA {
void operationA();
}
// 产品接口B
interface ProductB {
void operationB();
}
// 具体产品A1
class ConcreteProductA1 implements ProductA {
@Override
public void operationA() {
System.out.println("ConcreteProductA1");
}
}
// 具体产品A2
class ConcreteProductA2 implements ProductA {
@Override
public void operationA() {
System.out.println("ConcreteProductA2");
}
}
// 具体产品B1
class ConcreteProductB1 implements ProductB {
@Override
public void operationB() {
System.out.println("ConcreteProductB1");
}
}
// 具体产品B2
class ConcreteProductB2 implements ProductB {
@Override
public void operationB() {
System.out.println("ConcreteProductB2");
}
}
// 测试
public class Test {
public static void main(String[] args) {
AbstractFactory factory = new ConcreteFactory1();
ProductA productA = factory.createProductA();
ProductB productB = factory.createProductB();
productA.operationA(); // 输出: ConcreteProductA1
productB.operationB(); // 输出: ConcreteProductB1
}
}
3. 观察者模式 (Observer Pattern)
问题描述
观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
解决方案
接口定义
java
// 观察者接口
interface Observer {
void update(String message);
}</p>
<p>// 主题接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
实现
java
// 具体主题
class ConcreteSubject implements Subject {
private List observers = new ArrayList<>();
private String state;</p>
<pre><code>@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
}
// 具体观察者
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);
}
}
// 测试
public class Test {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer1");
Observer observer2 = new ConcreteObserver("Observer2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setState("State Changed"); // 输出: Observer1 received: State Changed, Observer2 received: State Changed
}
}
详细单例模式、工厂模式和观察者模式的实现方式及应用场景。通过这些设计模式,开发者可以更好地组织代码结构,提升系统的灵活性和可维护性。在实际开发中,选择合适的设计模式能够显著提高开发效率和代码质量。