`

OOAD 单例模式

 
阅读更多

 单例模式的要点
  单例单例
  显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须 自行创建这个事例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

  资源管理
  一些资源管理器常常设计成单例模式。
  在计算机系统中,需要管理的资源包括软件外 部资源,譬如每台计算机可以有若干个打印机,但只能有一个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就不会被实例,可以执行该类其他静态方法。


缺点: 第一次加载时发应不快

 

 

分享到:
评论

相关推荐

    ooad设计模式软件架构分析资料

    《Design Patterns Explained》提供了23个GOF(Gang of Four)设计模式的详细解析,如工厂模式、单例模式和观察者模式,这些都是软件工程师日常工作中不可或缺的工具。 软件分析是软件开发早期阶段的关键活动,它...

    OOAD教师用书(IBM 原厂)word版

    设计模式是解决常见软件设计问题的标准化解决方案,如单例模式、工厂模式、观察者模式等。IBM的教材会详细讲解这些模式的原理、应用场景和实现方式,帮助学生掌握如何在实际项目中灵活运用这些模式,以提高代码的...

    OOAD系列PPT

    第三章“创建型设计模式”重点讲解了工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。这些模式主要关注对象的创建,能够灵活地控制实例化过程,减少类之间的耦合。 第四章“结构型设计模式”涉及适配器...

    OOAD.rar_OOAD

    1. 单例模式:确保一个类只有一个实例,并提供全局访问点,常用于管理共享资源。 2. 工厂模式:提供一个创建对象的接口,但让子类决定实例化哪一个类,工厂方法让类的实例化推迟到子类。 3. 观察者模式:定义对象...

    OOAD建模技术(完整PPT)

    此外,设计模式也是OOAD中的重要组成部分,它们是解决常见问题的成熟解决方案,如工厂模式、单例模式、观察者模式等。理解和熟练运用设计模式能提升软件设计的质量和可复用性。 总的来说,这个“OOAD建模技术”培训...

    OOAD与UML资料和笔记.zip

    4. **设计模式**:介绍一些常见的设计模式,如工厂模式、单例模式、观察者模式等,以及它们在OOAD中的应用。 5. **软件生命周期**:OOAD在软件开发生命周期中的位置,以及如何与其他阶段(如需求分析、编码、测试等...

    西北农林科技大学OOAD实验.rar

    3. **设计模式**:设计模式是解决常见软件设计问题的标准解决方案,如工厂模式、单例模式、观察者模式等,学生会在实践中应用这些模式来提高代码的可读性和可维护性。 4. **类与对象**:理解类的定义、属性和方法,...

    OOAD与UMLpdf文件

    1. **设计模式应用**:使用已验证的设计模式,如工厂模式、单例模式、观察者模式等,来解决常见设计问题。 2. **接口设计**:定义类的公共行为,确保不同组件间的协同工作。 3. **类与对象的实现细节**:考虑数据...

    OOAD第十一章1

    本篇将深入探讨标题和描述中提到的一些核心设计模式,包括Singleton(单例模式)、Adapter(适配器模式)、Strategy(策略模式)、Composite(组合模式)和Facade(外观模式),以及状态机图的概念。 1. **...

    面向对象分析与设计课件(OOAD、英文)

    设计模式,如工厂模式、单例模式、观察者模式等,也是设计阶段的重要工具,它们提供了解决常见设计问题的标准化方法。 3. 对象分析(Object Analysis):OOAD - Lecture 3 Object Analysis (ch09-11).pdf 对象分析...

    OOAD课堂练习作业和代码

    - **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。 - **工厂模式(Factory)**:提供创建对象的接口,但不指定具体类。 - **抽象工厂模式(Abstract Factory)**:为创建一组相关或相互...

    ooad.zip_it

    6. **设计模式**:在OOAD中,设计模式是解决常见问题的最佳实践,如工厂模式、单例模式、观察者模式等,它们为软件设计提供了可复用的解决方案。 7. **实现与测试**:将设计转化为代码,编写单元测试以确保代码质量...

    ooad book

    书中可能涵盖了如工厂模式、单例模式、观察者模式等常见的设计模式,这些模式都是OOAD的基础。设计模式是一种通用的、经过实践验证的解决方案,可以帮助开发者更好地理解和解决软件设计中的复杂性。 Java OOAD则...

    2本OOAD的书.快来下呀!

    2. 设计模式:工厂模式、单例模式、观察者模式、装饰器模式等,它们是解决常见软件设计问题的模板。 3. UML(统一建模语言):用例图、类图、序列图、状态图等,它们用于可视化地表达系统设计。 4. 面向对象分析:...

    Head First OOAD

    6. **设计模式**:设计模式是解决常见软件设计问题的经验总结,如工厂模式、单例模式、观察者模式等。书中可能包含了这些模式的实例代码,帮助读者理解和应用。 7. **UML统一建模语言**:UML是描述和可视化软件系统...

    软件开发方法与环境--设计模式(ppt)

    - 创建型模式:如单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式,它们关注对象的创建过程。 - 结构型模式:包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式,这些模式...

    OOAD 台湾 著名设计开发人员做的关系系统设计与分析的PPT

    4. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,及其在解决特定问题时的应用。 5. **系统架构**:探讨整体系统架构的选择,如三层架构或微服务架构,以及它们的优势和挑战。 6. **...

    OOAD的相关文档,相信会有帮助的!

    此外,PPT还可能涉及设计模式,这是解决常见软件设计问题的预定义解决方案,如工厂模式、单例模式和观察者模式等。 最后,OOAD文件可能是深入的技术文档或研究报告,详细阐述了面向对象设计的理论和实践。它可能...

    SVSE-S3冲刺题-OOAD

    6. **设计模式**:设计模式是解决常见问题的可重用解决方案,如工厂模式、单例模式、观察者模式等。 7. **需求分析**:在OOAD中,理解需求是至关重要的第一步,它涉及到识别问题域的关键实体、关系和行为。 8. **...

    OOAD学习资料

    7. **设计模式**:设计模式是解决常见问题的标准化解决方案,如工厂模式、单例模式、观察者模式等,它们在OOAD中扮演着重要角色。 在学习OOAD时,通常会涉及以下步骤: 1. **需求收集**:理解用户的需求,确定系统...

Global site tag (gtag.js) - Google Analytics