java设计模式详解

2025-04-12 32

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;
}

}

**优化**:可以通过双重检查锁定(Double-Checked Locking)来减少同步开销:
java
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
}

}


详细单例模式、工厂模式和观察者模式的实现方式及应用场景。通过这些设计模式,开发者可以更好地组织代码结构,提升系统的灵活性和可维护性。在实际开发中,选择合适的设计模式能够显著提高开发效率和代码质量。

Image

(本文来源:https://www.nzw6.com)

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关