`
亚当爱上java
  • 浏览: 705868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式深入研究

 
阅读更多

       单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界 访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

 

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可 以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个 方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

Static uniqueInstance是singleton的唯一实例, static sharedInstance将把它返回客户端。通常,sharedInstance会检查uniqueInstance是否已经被实例化。如果没有,它 会生成一个实例然后返回uniqueInstance。



 

动机

对 于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件 系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多 个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符, 也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止 我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就 是单例模式的模式动机。

要点

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。

优缺点

优点

一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点

一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

实例

Java中的单例模式

在java中,可以使用以下这种方式使用单例模式创建类的实例:
public class MyBean {
private static MyBean instance = null;
private MyBean(){
//do something
}
public static synchronized MyBean getInstance(){
if(instance == null){
instance = new MyBean();
}
return instance;
}
}
当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存,但这只是单例模式带来的一个好处。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有三种形式:
第一种形式: 也是常用的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第三种形式: 双重锁的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
  • 大小: 5.4 KB
  • 大小: 7.1 KB
分享到:
评论

相关推荐

    设计模式单例模式和工厂模式综合应用

    在软件设计中,模式是一种解决常见问题的有效方法。"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种...对于Java开发者来说,深入研究和实践这样的项目,不仅可以提升设计能力,也有助于提高代码质量和可维护性。

    IOS单例模式Demo

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在iOS开发中,单例模式被广泛应用于管理共享资源、配置设置...通过分析和研究`Singleton`中的示例,你将对单例模式有更深入的理解。

    IOS单例模式调试代码

    下面我们将深入探讨iOS中的单例模式以及如何进行调试。 首先,让我们了解什么是单例模式。单例模式的核心是限制类的实例化过程,使得类的所有实例都指向同一对象。在Objective-C或Swift中,我们通常通过以下步骤...

    Qt单例设计模式(1-8)

    接下来,我们将深入研究如何在实际项目中应用单例。例如,我们可以创建一个单例类来管理数据库连接,确保整个应用程序中只有一个数据库连接,避免了多次打开和关闭数据库导致的性能问题。此外,还可以使用单例来存储...

    C#设计模式(1)——单例模式.pdf

    ### C#设计模式详解:单例模式 #### 引言 设计模式是在软件工程领域内被广泛采用的一种最佳实践,其目的在于提供通用...无论是基于线程安全考虑还是性能优化,单例模式都是一个值得深入研究和灵活运用的设计模式。

    Java设计模式深入研究

    《Java设计模式深入研究》是一本专注于探讨Java编程领域中设计模式的专业著作。设计模式是软件工程中的宝贵经验总结,是解决常见问题的有效方案模板。本书深入剖析了这些模式,帮助开发者提升代码质量和可维护性。 ...

    IOS应用源码之单例模式 .rar

    通过研究压缩包中的"单例模式"文件,你可以更深入地了解如何在实际项目中应用单例模式,以及它如何与iOS的其他组件协作。这将有助于提高你的iOS编程技能,尤其是对于系统架构和设计模式的理解。

    C# 单例模式详解与线程安全性实现

    内容概要:本文详尽地阐述了 C# 中单例模式的设计思想以及其实现方式,并且特别针对单例模式的线例...方法来代替lock达到更加简明的线程安全代码设计也可以自行进一步深入探索和研究,提高代码效率的同时保证安全性。

    深入浅出java设计模式(高清中文PDF)

    《深入浅出Java设计模式》是一本专注于Java编程领域中的设计模式专著,旨在帮助开发者深化对设计模式的理解,...无论是初学者还是经验丰富的开发者,都应该深入研究设计模式,以便在编程生涯中不断提高并解决各种挑战。

    深入浅出设计模式 (希望对设计模式有所了解和深入研究的都适用)

    《深入浅出设计模式》是一本旨在帮助读者理解和掌握设计模式的书籍,适合那些希望深入研究设计模式的IT从业者。这本书可能与《HEAD FIRST设计模式》相辅相成,通过不同的讲解方式来帮助读者更全面地理解这一领域。 ...

    工厂接口虚函数抽象函数单例DEMO

    在IT行业中,三层架构是一种常见的软件设计模式,它将应用程序分为三个主要部分:表现层(Presentation Layer)、业务...通过深入研究和动手实践,可以更深入地理解三层架构以及面向对象设计原则在实际项目中的应用。

    设计模式之美——教你写出高质量代码

    通过深入研究这些例子,你可以看到设计模式如何改善代码结构,提高代码的可读性和可复用性。 总的来说,掌握设计模式对于任何软件开发者来说都是至关重要的。它不仅能够提高代码质量,还能提升个人技术水平,为职场...

    c++ 创建性模式(模式源代码)

    在编程领域,设计模式是一种被广泛认可的解决常见问题的最佳实践。创建性设计模式是其中的一个...在提供的"singleton"文件中,你可以找到单例模式的实现示例,研究并理解它的实现方式,将有助于你更好地掌握单例模式。

    C#设计模式,单件模式,C#代码

    在资源包中的"02单例模式"文件中,你可能会找到上述不同实现方式的代码示例,通过学习和实践这些代码,你可以深入理解单例模式的工作原理及其在C#中的应用。同时,了解单例模式的优缺点也是必要的,比如它可能导致...

    《Java设计模式》课程设计报告.docx

    这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为初学者提供了一个良好的实践平台。 1. **单例模式**: 单例模式是一种确保一个类只有一个实例并提供全局访问点的设计模式。...

    软件秘籍设计模式那点事源码

    设计模式是软件开发中的宝贵经验总结,它代表了在特定情境下解决常见问题的最佳实践。...深入研究这些代码,不仅能够增强对设计模式的理解,还能提升我们的编程素养,使我们在面对复杂问题时更加游刃有余。

    C++设计模式详解与应用

    内容概要:本文详细解析了24种经典C++设计模式和七大基本原则,并对工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)、原型模式、适配器模式、桥接模式、单例模式、原型模式、外观模式、装饰模式、命令模式、...

    JAVA设计模式在工作流管理系统中的应用研究.pdf

    具体来说,本文着重讨论了两种模式——单例模式和模板方法模式。 a) **单例模式**: 单例模式确保一个类只有一个实例,并提供全局访问点。在WFMS中,这种模式适用于那些需要全局共享且只需一个实例的对象,例如...

    你想要Android数据库操作精华(安全、并发、单例等)

    本Demo——"你想要的Android数据库操作精华(安全、并发、单例等)",旨在深入探讨如何在Android Studio环境下进行高效且安全的数据库操作,包括使用数据库框架、数据库加密、并发控制以及单例模式的应用。...

Global site tag (gtag.js) - Google Analytics