Java设计模式:从单例到观察者

设计模式是解决特定问题的通用解决方案。在Java编程中,设计模式可以帮助我们编写更灵活、可维护和可扩展的代码。本文将介绍几种常见的Java设计模式,包括单例、工厂、策略、装饰器和观察者模式。

1. 单例模式

单例模式是一种创建型模式,它确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

2. 工厂模式

工厂模式是一种创建型模式,它提供了一种接口来创建对象,而不是直接使用new关键字。

public interface Animal {void makeSound();
}public class Dog implements Animal {public void makeSound() {System.out.println("Woof!");}
}public class AnimalFactory {public static Animal createAnimal(String type) {if (type.equals("dog")) {return new Dog();} else {// Handle other animal typesreturn null;}}
}Animal animal = AnimalFactory.createAnimal("dog");
animal.makeSound();

3. 策略模式

策略模式是一种行为型模式,它定义了一系列算法,并将每个算法封装在一个可互换的对象中。

public interface SortingStrategy {void sort(int[] arr);
}public class BubbleSort implements SortingStrategy {public void sort(int[] arr) {// Bubble sort implementation}
}public class SelectionSort implements SortingStrategy {public void sort(int[] arr) {// Selection sort implementation}
}public class Sorter {private SortingStrategy strategy;public Sorter(SortingStrategy strategy) {this.strategy = strategy;}public void setStrategy(SortingStrategy strategy) {this.strategy = strategy;}public void sort(int[] arr) {strategy.sort(arr);}
}Sorter sorter = new Sorter(new BubbleSort());
sorter.sort(new int[]{5, 2, 8, 1});

4. 装饰器模式

装饰器模式是一种结构型模式,它动态地给一个对象添加一些额外的功能,而不影响该对象的原有功能。

public abstract class Beverage {protected String description = "Unknown Beverage";public String getDescription() {return description;}public abstract double cost();
}public class HouseBlend extends Beverage {public HouseBlend() {description = "House Blend Coffee";}public double cost() {return 0.89;}
}public abstract class CondimentDecorator extends Beverage {protected Beverage beverage;public CondimentDecorator(Beverage beverage) {this.beverage = beverage;}public abstract String getDescription();
}public class Mocha extends CondimentDecorator {public Mocha(Beverage beverage) {super(beverage);}public String getDescription() {return beverage.getDescription() + ", Mocha";}public double cost() {return beverage.cost() + 0.20;}
}Beverage beverage = new HouseBlend();
beverage = new Mocha(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());

5. 观察者模式

观察者模式是一种行为型模式,它定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会受到通知并自动更新。

public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {public void update(String message) {System.out.println("Received message: " + message);}
}public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);
}public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.notifyObservers("Hello, world!");

每个设计模式都有着各自的使用场景、优缺点和使用注意事项,下面为大家集中一一介绍:

1. 单例模式

使用场景:

  • 当你需要控制一个类的实例数量时,例如配置对象、日志记录器等。
  • 在全局范围内共享资源或状态时,例如数据库连接池、配置信息等。

优点:

  • 保证一个类只有一个实例,可以有效地控制资源的使用。
  • 提供了一个全局访问点,方便在系统中共享和访问该实例。

缺点:

  • 单例模式可能会导致代码的耦合度增加,因为它使得其他类直接依赖于单例类。
  • 在多线程环境中,如果不正确地实现单例模式,可能会出现线程安全问题。

使用注意事项:

  • 确保单例类的构造函数是私有的,以防止外部代码创建新的实例。
  • 在多线程环境中,使用同步机制或双重检查锁定来保证线程安全。

2. 工厂模式

使用场景:

  • 当你需要根据不同的条件创建不同类型的对象时。
  • 当你想要隐藏对象创建的细节时。

优点:

  • 将对象的创建与使用分离,提高了代码的灵活性和可维护性。
  • 可以根据需要生成不同类型的对象,降低了代码的复杂度。

缺点:

  • 如果工厂方法过多,可能会使得工厂类变得庞大和难以管理。
  • 如果工厂方法的实现过于复杂,可能会增加系统的复杂度。

使用注意事项:

  • 工厂方法应该是静态的,以便在不创建工厂对象的情况下调用。
  • 在选择工厂模式时,需要权衡其带来的灵活性和系统复杂度的增加。

3. 策略模式

使用场景:

  • 当你需要在运行时选择不同的算法或行为时。
  • 当你想要避免使用大量的if-else语句来选择不同的算法或行为时。

优点:

  • 提高了代码的可扩展性和可维护性,因为新的策略可以轻松地添加到系统中。
  • 将算法或行为的选择与使用分离,提高了代码的灵活性。

缺点:

  • 如果有太多的策略,可能会使得系统的复杂度增加。
  • 客户端必须了解可用的策略,并选择合适的策略。

使用注意事项:

  • 确保所有策略都实现了相同的接口,以便在客户端中可以互换使用。
  • 在选择策略模式时,需要权衡其带来的灵活性和系统复杂度的增加。

4. 装饰器模式

使用场景:

  • 当你需要在不改变原有对象结构的情况下,动态地给对象添加新的功能时。
  • 当你需要将多个装饰器组合起来,形成更复杂的行为时。

优点:

  • 提供了一种灵活的方式来扩展对象的功能,而不需要修改原有代码。
  • 可以组合多个装饰器,形成更复杂的行为。

缺点:

  • 如果装饰器层次过深,可能会使得系统的复杂度增加。
  • 在某些情况下,装饰器模式可能会导致性能问题。

使用注意事项:

  • 确保装饰器和被装饰对象都实现了相同的接口。
  • 在设计装饰器时,需要考虑装饰器的顺序可能会影响最终结果。

5. 观察者模式

使用场景:

  • 当你需要在对象状态发生变化时,通知并更新所有依赖于它的对象时。
  • 当你想要实现松耦合的系统时。

优点:

  • 提供了一种松耦合的方式来实现对象之间的通信。
  • 可以动态地添加或删除观察者,提高了系统的灵活性。

缺点:

  • 如果有太多的观察者,可能会使得系统的性能下降。
  • 在某些情况下,观察者模式可能会导致代码的复杂度增加。

使用注意事项:

  • 确保观察者和被观察对象之间的依赖关系是正确的。
  • 在设计观察者模式时,需要考虑如何处理观察者在更新过程中的异常情况。

总结

设计模式是Java开发中非常重要的概念。它们提供了一种解决常见问题的方式,使得代码更加灵活、可维护和可扩展。通过学习和应用这些模式,你可以提高自己的编程技能并编写更好的Java代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023发卡商城源码,最新自助下单彩虹云商城系统免授权无后门源码

# 彩虹自助下单系统 > PHP版本: > 7.0.1 ____ * 去除所有授权验证 * 支持自定义说说接口 * 去除后台广告与更新 * 可自定义易支付接口 ____ >安装教程: > 1、上传源代码到空间或服务器&#xff0c;并确保权限可读写。 > 2、上传完成后&#xff0c;使用浏览器…

gcd之和(一维)

gcd之和 求 ∑ i 1 n gcd ⁡ ( n , i ) \sum_{i1}^{n}\gcd(n,i) ∑i1n​gcd(n,i)。 那么我们这一道题讲得详细一点。因为这一道题目的 n ≤ 1 0 9 n \leq 10^9 n≤109。这也就导致了一些算法是过不了的&#xff0c;那么我们就先从最简单的讲起&#xff1a; 对每一项来一遍 …

VulnHub:cengbox1

靶机下载地址&#xff0c;下载完成后&#xff0c;用VirtualBox打开靶机并修改网络为桥接即可搭建成功。 信息收集 主机发现和端口扫描 扫描攻击机&#xff08;192.168.31.218&#xff09;同网段存活主机确认目标机ip&#xff0c;并对目标机进行全面扫描。 nmap 192.168.31.…

springboot 项目整合 AI (文心一言)

百度智能云网址&#xff1a;https://cloud.baidu.com/?fromconsole 注册——个人认证——登录成功 第一步&#xff1a;点击千帆大模型平台 ​ 第二步&#xff1a;点击应用接入——创建应用 ​ 第三步&#xff1a;点击接口文档——API列表——可以点击指定模型进行查看调…

H3CNE(路由基础、直连路由与静态路由)

目录 6.1 直连路由 6.2 静态路由理解性实验 6.2.1 配置直连路由 6.2.2 配置静态路由 6.3 路由表的参数与比较 6.3.1 优先级的比较 6.3.2 开销的比较 6.4 路由器中的等价路由、浮动路由、默认路由 6.4.1 等价路由 6.4.2 浮动路由 6.4.3 默认路由(缺省路由) 6.1 直连路…

QT JSON使用实例

下面是一个使用Qt框架的示例代码&#xff0c;展示如何获取仪器的状态&#xff0c;将其打包成JSON格式&#xff0c;保存到当前目录下的JSON文件中&#xff0c;然后通过FTP发送该文件。 1. 准备工作 确保你已经安装了Qt&#xff0c;并创建一个新的Qt Console项目或Qt Widgets项目…

ChatGPT:ChatOpenAI 是什么?

ChatGPT&#xff1a;ChatOpenAI 是什么&#xff1f; ChatOpenAI 是 LangChain 库中的一个类&#xff0c;专门用于与 OpenAI 的 Chat 模型&#xff08;例如 GPT-4&#xff09;进行交互。LangChain 是一个用于构建自然语言处理应用的框架&#xff0c;它提供了与不同语言模型&…

Unity监听某个值是否改变,c#数值监听器

Unity监听某个值是否改变&#xff0c;c#数值监听器 功能监听某个值的变化&#xff0c;当监听到变化之后执行对应的注册事件。 需要创建一个监听器对应&#xff0c;每监听一个值就要创建一个监听器对象&#xff0c;监听器是泛型&#xff0c;需要填写监听的类型。 创建监听器完毕…

Python爬虫:代理ip电商数据实战

引言&#xff1a;数据访问管理引发的烦恼 作为一名Python博主&#xff0c;爬虫技能对于获取和分析数据至关重要&#xff0c;经常爬一下&#xff0c;有益身心健康嘛。爬虫技术对很多人来说&#xff0c;不仅仅是一种工具&#xff0c;更像是一种艺术&#xff0c;帮助我们从互联网…

Pytorch学习笔记——在GPU上进行训练

文章目录 1. 环境准备2. 导入必要库3. 加载数据集4. 定义简单的神经网络模型5. 检查和设置GPU设备6. 定义损失函数和优化器7. 训练模型8. 全部代码展示及运行结果 1. 环境准备 首先&#xff0c;确保PyTorch已经安装&#xff0c;且CUDA&#xff08;NVIDIA的并行计算平台和编程模…

org.springframework.context.annotation.ImportSelector的作用是什么?

org.springframework.context.annotation.ImportSelector 是 Spring 框架中一个非常有用的接口&#xff0c;它允许你根据条件动态地向 Spring 应用上下文中导入配置类。这对于开发模块化、可扩展且可配置的 Spring 应用来说非常有用。 如何使用 ImportSelector 创建 ImportSel…

Leetcode热题100 Day2

六、三数之和 这一题最关键的想法是把第二层嵌套和第三层嵌套合并为同一层嵌套&#xff0c;合并后即可使用两指针法。但是即使这样我在写的时候还是花了很多时间&#xff0c;一个是边界条件的处理&#xff08;尤其是连续有相同值的处理&#xff09;以及我发现了leetcode的编译…

用PyTorch从零开始编写DeepSeek-V2

DeepSeek-V2是一个强大的开源混合专家&#xff08;MoE&#xff09;语言模型&#xff0c;通过创新的Transformer架构实现了经济高效的训练和推理。该模型总共拥有2360亿参数&#xff0c;其中每个令牌激活21亿参数&#xff0c;支持最大128K令牌的上下文长度。 在开源模型中&…

java-双亲委派机制

Java虚拟机&#xff08;JVM&#xff09;中的类加载器&#xff08;Class Loader&#xff09;负责将类&#xff08;.class文件&#xff09;加载到JVM中&#xff0c;以便Java程序能够使用这些类。在JVM中&#xff0c;类加载器被组织成一种层次结构关系&#xff0c;这种层次结构关系…

vue3前端开发-小兔鲜项目-一些额外提醒的内容

vue3前端开发-小兔鲜项目-一些额外提醒的内容&#xff01;今天这一篇文章&#xff0c;是提醒大家&#xff0c;如果你正在学习小兔鲜这个前端项目&#xff0c;有些地方需要提醒大家&#xff0c;额外注意的地方。 第一个&#xff1a;就是大家在进入二级页面后&#xff0c;有一个分…

深度学习-7-使用DCGAN生成动漫头像(实战)

参考什么是GAN生成对抗网络,使用DCGAN生成动漫头像 1 什么是生成对抗网络 生成对抗网络,英文是Generative Adversarial Networks,简称GAN。 GAN是一种无监督的深度学习模型,于2014年首次被提出。该算法通过竞争学习的方式生成新的、且与原始数据集相似的数据。 这些生成…

公司培训总结:拒绝倦怠,探索工作中的自驱力

拒绝倦怠&#xff0c;探索工作中的自驱力 在快节奏、高压力的现代职场环境中&#xff0c;感到迷茫和缺乏动力是许多人的共同体验。工作中的倦怠感可能会导致生产力下降、职业发展受阻&#xff0c;甚至影响到个人的心理健康。然而&#xff0c;挖掘并激发我们的内在驱动力&#…

昇思25天学习打卡营第19天|生成式-DCGAN生成漫画头像

打卡 目录 打卡 GAN基础原理 DCGAN原理 案例说明 数据集操作 数据准备 数据处理和增强 部分训练数据的展示 构造网络 生成器 生成器代码 ​编辑 判别器 判别器代码 模型训练 训练代码 结果展示&#xff08;3 epoch&#xff09; 模型推理 GAN基础原理 原理介…

C#实战 | 天行健、上下而求索

本文介绍C#开发入门案例。 01、项目一&#xff1a;创建控制台应用“天行健&#xff0c;君子以自强不息” 项目说明&#xff1a; 奋斗是中华民族的底色&#xff0c;见山开山&#xff0c;遇水架桥&#xff0c;正是因为自强不息的奋斗&#xff0c;才有了辉煌灿烂的中华民族。今…

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时&#xff0c;只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格&#xff0c;分成了4级 步骤&#xff1a; 1、我们可以先按照这个层级设置下空列&#xff08;后买你会用到这个空列&#xff09; 二级不用加、三级前面加一列、四级前面加…