Java设计模式:分享在Java代码中使用的常见设计模式(比如工厂模式,观察者模式,装饰者模式等),以及何时适合使用它们

一、设计模式的概念与重要性

设计模式的定义:
设计模式是一种在特定情况下,为了解决特定问题的编程设计策略。实质上,它是一种优秀的软件设计经验的总结。使用设计模式可以使代码更容易理解、修改和扩展,并且能够提高代码的健壮性和可维护性。

 

设计模式的分类:
设计模式通常可以分为三大类型:创建型、结构型和行为型。

 
  1. 创建型模式:主要解决对象的创建问题。这类设计模式包括单例模式、抽象工厂模式、建造者模式等。

  2. 结构型模式:主要解决类或对象的组合或组装问题,使得这些类或对象能够协同工作。包括适配器模式、装饰器模式、代理模式等。

  3. 行为型模式:主要解决的是类或对象之间的交互,以及划分职责和算法问题。包括观察者模式、策略模式、模板方法模式等。

 

为什么使用设计模式:
设计模式提供了一种统一和标准化的方法来解决常见的软件设计问题。这些下面几点是设计模式的好处:

 
  1. 代码可重用:经过良好设计的模式可以使解决特定问题的代码在不同的项目中反复使用。

  2. 提高效率:设计模式提供了一种解决特定问题的蓝图,程序员可以快速地使用这些模式,而不是从零开始创建解决方案。

  3. 使代码易于理解:设计模式定义了一种通用的设计语言,使得程序员之间的交流更加容易。

  4. 提升健壮性:使用经过验证的设计模式会降低出现错误和问题的几率。

  5. 提高系统性能:某些设计模式可以帮助优化系统性能,如利用单例模式控制资源的使用等。

二、创建型模式

工厂模式定义与使用场景:

 

工厂模式是一种创建型设计模式,该模式提供了一种封装对象创建逻辑的方式。在工厂模式中,我们创建对象不直接使用new操作符,而是使用一个工厂类的方法,该方法根据提供的参数返回不同类的实例。

 

工厂模式通常在以下场景使用:

 
  1. 当一个类不知道它所必须创建的对象的类的时候。
  2. 当一个类希望由其子类来指定它所创建的对象的时候。
  3. 当类将创建对象的职责委托给多个帮助类中的某一个,并且你希望将哪一个帮助类是代理者这一信息局部化的时候。
 

Java中如何实现:

 

以下是一个简单的工厂模式的示例:

// 抽象产品
public interface Product {
    void use();
}

// 具体产品A
public class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using product A");
    }
}

// 具体产品B
public class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using product B");
    }
}

// 工厂类
public class ProductFactory {
    public Product getProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端代码
ProductFactory factory = new ProductFactory();
Product productA = factory.getProduct("A");
productA.use();  // 输出:Using product A

Product productB = factory.getProduct("B");
productB.use();  // 输出:Using product B

单例模式定义和使用场景:

 

单例模式是一种创建型设计模式,它保证了一个类只有一个实例,并提供了一个全局访问点来获取这个唯一对象。单例模式的主要目的是共享资源,尤其适合那些确保系统中的某个类只存在一个实例的场景。

 

以下是一些适用单例模式的常见场景:

 
  1. 想要控制对共享资源的访问,如数据库连接或线程池。
  2. 需要限制系统内的某个类只能有一个实例,如日志应用或游戏的得分管理。
  3. 当创建一个对象需要消耗的资源过多,如一个对象需要加载各种配置文件和生成各种大对象时。
 

Java中如何实现:

 

以下是一个典型的单例模式在Java中如何实现的示例:

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
 

在这个例子中,单例模式通过提供一个getInstance()方法和一个私有的构造方法来实现。在getInstance()方法中,仅当uniqueInstance为null时才创建Singleton的新实例,确保了系统中只有一个Singleton实例存在。请注意,为了防止在多线程环境下产生多个实例,我们使用了synchronized关键字。

 

然后,我们可以通过Singleton.getInstance()来全局访问这个单例。

原型模式定义和使用场景:

 

原型模式是一种创建型设计模式,它实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

 

以下是一些适用原型模式的常见场景:

 
  1. 类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等。通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
  2. 通过一个复杂对象的复制来避免创建对象的开销。一般来说,创建一个对象需要很复杂的过程,所以复制对象就成了一种比较方便的方式。
 

Java中如何实现:

 

在Java中,可以利用java.lang.Cloneable接口和clone()方法来实现原型模式。以下是一个示例:

<
  • 28
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 以下是一个简单的观察者设计模式Java代码示例: ```java import java.util.ArrayList; import java.util.List; // 主题接口 interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 具体主题类 class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyObservers(); } @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(); } } } // 观察者接口 interface Observer { void update(); } // 具体观察者类 class ConcreteObserver implements Observer { private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update() { System.out.println("Subject state changed: " + subject.getState()); } } // 测试代码 public class ObserverPatternExample { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(subject); ConcreteObserver observer2 = new ConcreteObserver(subject); subject.setState(1); subject.setState(2); } } ``` 在上面的代码,`Subject`接口定义了注册观察者、移除观察者和通知观察者的方法。`ConcreteSubject`类是具体的主题类,实现了`Subject`接口,并维护了一个观察者列表和一个状态变量。当状态变化时,它会调用`notifyObservers()`方法通知所有观察者。 `Observer`接口定义了观察者的更新方法。`ConcreteObserver`类是具体的观察者类,实现了`Observer`接口,并在构造函数将自身注册到主题对象。当主题状态变化时,观察者会收到通知并执行相应的更新操作。 在测试代码,我们创建了一个具体主题对象和两个具体观察者对象。然后通过改变主题对象的状态来触发观察者的更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎 你看

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值