单例模式的要点
单例单例
显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须 自行创建这个事例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
资源管理
一些资源管理器常常设计成单例模式。
在计算机系统中,需要管理的资源包括软件外 部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情 况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。
需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。
需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管理,不可政出多头。
这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。
一个例子:Windows 回收站
Windows 9x 以后的视窗系统中都有一个回收站,下图就显示了Windows 2000 的回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
1.预先加载法
class S1 { private S1() { System.out.println("ok1"); } private static S1 instance = new S1(); public static S1 getInstance() { return instance; } }
优点:
1.线程安全的
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
缺点: 资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化了
2.initialization on demand,延迟加载法 (考虑多线程)
class S2 { private S2() { System.out.println("ok2"); } private static S2 instance = null; public static synchronized S2 getInstance() { if (instance == null) instance = new S2(); return instance; } }
优点: 资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点: 第一次加载时发应不快 ,多线程使用不必要的同步开销大
3.initialization on demand double check 双重检测( 考虑多线程 )
class S3 { private S3() { System.out.println("ok3"); } private static S3 instance = null; public static S3 getInstance() { if (instance == null) { synchronized (S3.class) { if (instance == null) instance = new S3(); } } return instance; } }
优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点: 第一次加载时发应不快 ,由于java 内存模型一些原因偶尔会失败
4.initialization on demand holder (考虑多线程)
class S4 { private S4() { System.out.println("ok4"); } private static class S4Holder { static S4 instance = new S4(); } public static S4 getInstance() { return S4Holder.instance; } }
优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点: 第一次加载时发应不快
相关推荐
《Design Patterns Explained》提供了23个GOF(Gang of Four)设计模式的详细解析,如工厂模式、单例模式和观察者模式,这些都是软件工程师日常工作中不可或缺的工具。 软件分析是软件开发早期阶段的关键活动,它...
设计模式是解决常见软件设计问题的标准化解决方案,如单例模式、工厂模式、观察者模式等。IBM的教材会详细讲解这些模式的原理、应用场景和实现方式,帮助学生掌握如何在实际项目中灵活运用这些模式,以提高代码的...
第三章“创建型设计模式”重点讲解了工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。这些模式主要关注对象的创建,能够灵活地控制实例化过程,减少类之间的耦合。 第四章“结构型设计模式”涉及适配器...
1. 单例模式:确保一个类只有一个实例,并提供全局访问点,常用于管理共享资源。 2. 工厂模式:提供一个创建对象的接口,但让子类决定实例化哪一个类,工厂方法让类的实例化推迟到子类。 3. 观察者模式:定义对象...
此外,设计模式也是OOAD中的重要组成部分,它们是解决常见问题的成熟解决方案,如工厂模式、单例模式、观察者模式等。理解和熟练运用设计模式能提升软件设计的质量和可复用性。 总的来说,这个“OOAD建模技术”培训...
4. **设计模式**:介绍一些常见的设计模式,如工厂模式、单例模式、观察者模式等,以及它们在OOAD中的应用。 5. **软件生命周期**:OOAD在软件开发生命周期中的位置,以及如何与其他阶段(如需求分析、编码、测试等...
3. **设计模式**:设计模式是解决常见软件设计问题的标准解决方案,如工厂模式、单例模式、观察者模式等,学生会在实践中应用这些模式来提高代码的可读性和可维护性。 4. **类与对象**:理解类的定义、属性和方法,...
1. **设计模式应用**:使用已验证的设计模式,如工厂模式、单例模式、观察者模式等,来解决常见设计问题。 2. **接口设计**:定义类的公共行为,确保不同组件间的协同工作。 3. **类与对象的实现细节**:考虑数据...
本篇将深入探讨标题和描述中提到的一些核心设计模式,包括Singleton(单例模式)、Adapter(适配器模式)、Strategy(策略模式)、Composite(组合模式)和Facade(外观模式),以及状态机图的概念。 1. **...
设计模式,如工厂模式、单例模式、观察者模式等,也是设计阶段的重要工具,它们提供了解决常见设计问题的标准化方法。 3. 对象分析(Object Analysis):OOAD - Lecture 3 Object Analysis (ch09-11).pdf 对象分析...
- **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。 - **工厂模式(Factory)**:提供创建对象的接口,但不指定具体类。 - **抽象工厂模式(Abstract Factory)**:为创建一组相关或相互...
6. **设计模式**:在OOAD中,设计模式是解决常见问题的最佳实践,如工厂模式、单例模式、观察者模式等,它们为软件设计提供了可复用的解决方案。 7. **实现与测试**:将设计转化为代码,编写单元测试以确保代码质量...
书中可能涵盖了如工厂模式、单例模式、观察者模式等常见的设计模式,这些模式都是OOAD的基础。设计模式是一种通用的、经过实践验证的解决方案,可以帮助开发者更好地理解和解决软件设计中的复杂性。 Java OOAD则...
2. 设计模式:工厂模式、单例模式、观察者模式、装饰器模式等,它们是解决常见软件设计问题的模板。 3. UML(统一建模语言):用例图、类图、序列图、状态图等,它们用于可视化地表达系统设计。 4. 面向对象分析:...
6. **设计模式**:设计模式是解决常见软件设计问题的经验总结,如工厂模式、单例模式、观察者模式等。书中可能包含了这些模式的实例代码,帮助读者理解和应用。 7. **UML统一建模语言**:UML是描述和可视化软件系统...
- 创建型模式:如单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式,它们关注对象的创建过程。 - 结构型模式:包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式,这些模式...
4. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,及其在解决特定问题时的应用。 5. **系统架构**:探讨整体系统架构的选择,如三层架构或微服务架构,以及它们的优势和挑战。 6. **...
此外,PPT还可能涉及设计模式,这是解决常见软件设计问题的预定义解决方案,如工厂模式、单例模式和观察者模式等。 最后,OOAD文件可能是深入的技术文档或研究报告,详细阐述了面向对象设计的理论和实践。它可能...
6. **设计模式**:设计模式是解决常见问题的可重用解决方案,如工厂模式、单例模式、观察者模式等。 7. **需求分析**:在OOAD中,理解需求是至关重要的第一步,它涉及到识别问题域的关键实体、关系和行为。 8. **...
7. **设计模式**:设计模式是解决常见问题的标准化解决方案,如工厂模式、单例模式、观察者模式等,它们在OOAD中扮演着重要角色。 在学习OOAD时,通常会涉及以下步骤: 1. **需求收集**:理解用户的需求,确定系统...