没有合适的资源?快使用搜索试试~ 我知道了~
首页Java开发:23种设计模式详解与应用
"Java开发中的23种设计模式详解文档深入探讨了面向对象编程中的核心设计原则和模式,这些模式对于提升代码质量和可维护性具有重要意义。设计模式被划分为三大类别:创建型模式、结构型模式和行为型模式。 1. 创建型模式:包括工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式。这些模式主要关注对象的创建过程,如如何灵活地实例化对象,保持系统灵活性的同时提供标准化的接口。 2. 结构型模式:包括适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。这类模式关注的是对象之间的关系和组合,以提高系统的结构清晰性和代码的复用性。 3. 行为型模式:涵盖了策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。这些模式关注的是对象的行为和交互方式,旨在解决动态变化的业务需求。 文档强调了设计模式的两大原则:开闭原则和里氏替换原则。开闭原则主张通过接口和抽象类来保持代码的扩展性,避免直接修改原有代码;里氏替换原则确保子类可以替换基类而不影响系统功能,是继承复用的核心基础。 通过结合理论与实践的学习,本文档旨在帮助Java开发者理解和应用这些设计模式,从而提升软件工程的质量和效率,成为一名更优秀的软件工程师。学习设计模式不仅能够解决实际开发中的常见问题,还能促进团队间的协作,提高代码的可读性和可维护性。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/88251420/bgb.jpg)
4. public static Singleton getInstance(){
5. return SingletonFactory.instance;
6. }
实际情况是,单例模式使用内部类来维护单例的实现,JVM 内部的机制能够保证当一个类
被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用 getInstance 的
时候,JVM 能够帮我们保证 instance 只被创建一次,并且会保证把赋值给 instance 的内
存初始化完毕,这样我们就不用担心上面的问题。同时该方法也只会在第一次调用的时候使
用互斥机制,这样就解决了低性能问题。这样我们暂时总结一个完美的单例模式:
[java] view plaincopy
1. public class Singleton {
2.
3. /* 私有构造方法,防止被实例化 */
4. private Singleton() {
5. }
6.
7. /* 此处使用一个内部类来维护单例 */
8. private static class SingletonFactory {
9. private static Singleton instance = new Singleton();
10. }
11.
12. /* 获取实例 */
13. public static Singleton getInstance() {
14. return SingletonFactory.instance;
15. }
16.
17. /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
18. public Object readResolve() {
19. return getInstance();
20. }
21.}
其实说它完美,也不一定,如果在构造函数中抛出异常,实例将永远得不到创建,也会出错。
所以说,十分完美的东西是没有的,我们只能根据实际情况,选择最适合自己应用场景的实
现方法。也有人这样实现:因为我们只需要在创建类的时候进行同步,所以只要将创建和
getInstance()分开,单独为创建加 synchronized 关键字,也是可以的:
[java] view plaincopy
1. public class SingletonTest {
2.
3. private static SingletonTest instance = null;
4.
5. private SingletonTest() {
6. }
7.
![](https://csdnimg.cn/release/download_crawler_static/88251420/bgc.jpg)
8. private static synchronized void syncInit() {
9. if (instance == null) {
10. instance = new SingletonTest();
11. }
12. }
13.
14. public static SingletonTest getInstance() {
15. if (instance == null) {
16. syncInit();
17. }
18. return instance;
19. }
20.}
考虑性能的话,整个程序只需创建一次实例,所以性能也不会有什么影响。
补充:采用"影子实例"的办法为单例对象的属性同步更新
[java] view plaincopy
1. public class SingletonTest {
2.
3. private static SingletonTest instance = null;
4. private Vector properties = null;
5.
6. public Vector getProperties() {
7. return properties;
8. }
9.
10. private SingletonTest() {
11. }
12.
13. private static synchronized void syncInit() {
14. if (instance == null) {
15. instance = new SingletonTest();
16. }
17. }
18.
19. public static SingletonTest getInstance() {
20. if (instance == null) {
21. syncInit();
22. }
23. return instance;
24. }
25.
26. public void updateProperties() {
27. SingletonTest shadow = new SingletonTest();
![](https://csdnimg.cn/release/download_crawler_static/88251420/bgd.jpg)
28. properties = shadow.getProperties();
29. }
30.}
通过单例模式的学习告诉我们:
1、单例模式理解起来简单,但是具体实现起来还是有一定的难度。
2、synchronized 关键字锁定的是对象,在用的时候,一定要在恰当的地方使用(注意需
要使用锁的对象和过程,可能有的时候并不是整个对象及整个过程都需要锁)。
到这儿,单例模式基本已经讲完了,结尾处,笔者突然想到另一个问题,就是采用类的静态
方法,实现单例模式的效果,也是可行的,此处二者有什么不同?
首先,静态类不能实现接口。(从类的角度说是可以的,但是那样就破坏了静态了。因为接
口中不允许有 static 修饰的方法,所以即使实现了也是非静态的)
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化。之所以延迟加载,是因
为有些类比较庞大,所以延迟加载有助于提升性能。
再次,单例类可以被继承,他的方法可以被覆写。但是静态类内部方法都是 static,无法被
覆写。
最后一点,单例类比较灵活,毕竟从实现上只是一个普通的 Java 类,只要满足单例的基本
需求,你可以在里面随心所欲的实现一些其它功能,但是静态类不行。从上面这些概括中,
基本可以看出二者的区别,但是,从另一方面讲,我们上面最后实现的那个单例模式,内部
就是用一个静态类来实现的,所以,二者有很大的关联,只是我们考虑问题的层面不同罢了。
两种思想的结合,才能造就出完美的解决方案,就像 HashMap 采用数组+链表来实现一样,
其实生活中很多事情都是这样,单用不同的方法来处理问题,总是有优点也有缺点,最完美
的方法是,结合各个方法的优点,才能最好的解决问题!
4、建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,
用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面
抽象工厂模式和最后的 Test 结合起来得到的。我们看一下代码:
还和前面一样,一个 Sender 接口,两个实现类 MailSender 和 SmsSender。最后,建
造者类如下:
[java] view plaincopy
1. public class Builder {
2.
3. private List<Sender> list = new ArrayList<Sender>();
4.
5. public void produceMailSender(int count){
6. for(int i=0; i<count; i++){
7. list.add(new MailSender());
8. }
9. }
剩余60页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/7386ab88f5ce450e8817b9541ae085eb_caryxp.jpg!1)
小小哭包
- 粉丝: 1907
- 资源: 3982
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- VMP技术解析:Handle块优化与壳模板初始化
- C++ Primer 第四版更新:现代编程风格与标准库
- 计算机系统基础实验:缓冲区溢出攻击(Lab3)
- 中国结算网上业务平台:证券登记操作详解与常见问题
- FPGA驱动的五子棋博弈系统:加速与创新娱乐体验
- 多旋翼飞行器定点位置控制器设计实验
- 基于流量预测与潮汐效应的动态载频优化策略
- SQL练习:查询分析与高级操作
- 海底数据中心散热优化:从MATLAB到动态模拟
- 移动应用作业:MyDiaryBook - Google Material Design 日记APP
- Linux提权技术详解:从内核漏洞到Sudo配置错误
- 93分钟快速入门 LaTeX:从入门到实践
- 5G测试新挑战与罗德与施瓦茨解决方案
- EAS系统性能优化与故障诊断指南
- Java并发编程:JUC核心概念解析与应用
- 数据结构实验报告:基于不同存储结构的线性表和树实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)