`

单例模式之学习

阅读更多
一、单例模式介绍
    
    Singleton模式是一种建型模式,指某个类采用Singleton模式,则在这类类创建后,只能产生一个实便供外部访问。并且提供一个全局访问点。
   
    全局对象和Singleton模式有本质的区别,因为大量的使用全局对象对影响程序的质量,并且很多语言根本不支持全局变量。并且全局对象方式并不能阻止一个类对实例化多次。

二、单例的特点

    1、单例只能有一个实例

    2、单例必须自己为自己创建唯一的实例。

    3、单例必须为其它对象提供这一唯一实例。

三、单例模式的应用

    1、每台计算机可以由若干个打印机,但只能有一个Printer Spooler,避免有两个作业同时输出到打印机。

    2、一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键。否则会出现主键重复。

四、单例模式使用注意

   1、不要使用单例模式存取全局变量。这违背了单列模式的用意,最好放到对应类的静态成员中。
   3、不要将数据库连接做成单例,因为一个系统可能与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放。

五、单例模式的举例

(1)
/* 线程安全 但效率比较低  一开始就要加载类new一个 对象
这是饿汉方式的单例模式*/

public class Singleton1 {
private Singleton1(){
}
private static final Singleton1 instance=new Singleton1();
public static Singleton1 getInstancei(){
return instance;
}
}

(2)
// 饱汉方式的单例模式 但是有多个线程访问时就不是安全的 返回的不是同一个对象
public class Singleton {
private Singleton(){
}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
(3)
//虽然是安全的 但是效率非常低在一个时候只有一个线程能访问  同时返回一个对象
public class Singleton2 {
private Singleton2(){
}
private static Singleton2 instance;
public static synchronized Singleton2 getInstance() {
if (instance == null)
instance = new Singleton2();
return instance;
}
}

(4)
/* 线程安全  并且效率高  能有多个线程访问*/
public class Singleton3 {
private static Singleton3 instance;
private Singleton3() {
}
public static Singleton3 getIstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
}

(5)登记式

import java.util.HashMap;
  import java.util.Map;
  //登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
  public class Singleton3 {
      private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
      static{
          Singleton3 single = new Singleton3();
          map.put(single.getClass().getName(), single);
     }
     //保护的默认构造子
     protected Singleton3(){}
     //静态工厂方法,返还此类惟一的实例
     public static Singleton3 getInstance(String name) {
         if(name == null) {
             name = Singleton3.class.getName();
             System.out.println("name == null"+"--->name="+name);
         }
         if(map.get(name) == null) {
             try {
                 map.put(name, (Singleton3) Class.forName(name).newInstance());
             } catch (InstantiationException e) {
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             } catch (ClassNotFoundException e) {
                 e.printStackTrace();
             }
         }
         return map.get(name);
     }
     //一个示意性的商业方法
     public String about() {   
         return "Hello, I am RegSingleton.";   
     }   
     public static void main(String[] args) {
         Singleton3 single3 = Singleton3.getInstance(null);
         System.out.println(single3.about());
     }
}




转自:http://wenku.baidu.com/view/db5006e981c758f5f61f678d.html?from_page=view&from_mod=download
http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html
分享到:
评论

相关推荐

    设计模式之单例模式(结合工厂模式)

    在项目中,`src`目录可能包含了这些设计模式的源码示例,可以用来学习和理解如何实际应用单例模式和工厂模式。通过阅读和分析这些代码,你可以更深入地理解这两种模式的实现细节及其在实际开发中的作用。同时,也...

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

    总的来说,这个项目为学习和理解单例模式和工厂模式在实际开发中的应用提供了一个很好的示例。通过结合这两种模式,可以构建出既保证了对象唯一性,又能灵活应对不同产品创建需求的系统。对于Java开发者来说,深入...

    设计模式C++学习之单例模式(Singleton)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。...通过学习和实践这些单例模式的实现,我们可以更好地理解和应用设计模式,提升代码的质量和可维护性。

    设计模式单例模式PPT学习教案.pptx

    设计模式单例模式学习教案 单例模式概述 单例模式是设计模式中的一种,用于确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式对对象的创建和访问进行了限制,以确保系统中只有一个实例...

    单例模式,single

    ### 单例模式详解 #### 概述与应用场景 单例模式是一种常用的设计模式,它的主要目的是确保某个类仅有一个实例...通过上述讨论,我们可以看到单例模式在不同场景下的适用性及其潜在问题,并学习到了相应的解决方案。

    实用Java的单例模式,实用于Java学习者

    实用Java的单例模式,实用于Java学习者 单例模式 单例模式

    设计模式 中的 单例模式和观察者模式

    在给定的标题和描述中,我们关注的是两种重要的设计模式:单例模式和观察者模式。 首先,让我们深入了解单例模式。单例模式是一种确保一个类只有一个实例,并提供全局访问点的设计模式。这种模式在资源管理、缓存、...

    单例模式代码.rar

    在压缩包文件"课堂演示代码"中,可能包含了以上各种单例模式实现的示例代码,供学习者理解和实践。通过这些代码,你可以亲手运行并观察不同实现方式的效果,进一步理解单例模式的工作原理及其在Java中的应用。

    单例模式源代码

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例...了解并掌握这些单例模式的实现方式,对于后续学习其他设计模式以及提高代码质量都是非常有帮助的。

    单例模式(用winform写的)

    通过分析这个示例代码,我们可以学习如何将单例模式融入到实际项目中,了解如何创建和使用单例类,以及如何在Winform的环境中处理多线程问题。 单例模式的优点包括: 1. 节省内存:避免了多次实例化同一对象。 2. ...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    本篇将深入探讨标题中提及的几种设计模式:Model-View-Controller(MVC)模式、单例模式、代理模式以及工厂模式,尤其是简单工厂模式。 **1. Model-View-Controller (MVC) 模式** MVC模式是一种架构模式,它将应用...

    Qt单例模式MySQL连接池.rar

    本资源"Qt单例模式MySQL连接池.rar"提供了一个使用Qt框架并结合C++单例模式实现的MySQL数据库连接池模板,旨在优化Qt数据库开发的效率。 首先,我们来理解一下“单例模式”。单例模式是一种设计模式,它确保一个类...

    第 单例模式PPT学习教案.pptx

    第 单例模式PPT学习教案.pptx

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    例如,MVC模式在Web应用开发中非常常见,单例模式常用于日志服务、数据库连接池等需要全局唯一的场景,代理模式可以用于数据访问控制,工厂模式则用于解耦对象的创建和使用。通过学习和实践这些模式,开发者可以更好...

    单例模式与装饰着模式.md

    通过学习java 简单总结单例模式与装饰者模式,做一下入门总结,主要讲述单例模式中饿汉式与懒汉式的相同点与不同点,方便理解记忆。

    最简单的单例模式源码

    单例模式是软件设计模式中的一种基础且常用模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和...通过`Singleton.java`文件,我们可以学习到如何在Java中实现一个简单的懒汉式单例模式。

    设计模式入门之一:深入单例模式

    单例模式是设计模式中最基础且常用的一种,它旨在确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,有些对象只需要一个实例就能满足需求,比如线程池、数据库连接、配置管理等。使用单例模式可以避免...

    适合初学者的音频播放器代码C#单例模式设计

    在这个项目中,“适合初学者的音频播放器代码C#单例模式设计”为学习者提供了一个很好的起点,它通过实际的应用场景来讲解单例模式。 单例模式是设计模式的一种,它的核心思想是确保一个类只有一个实例,并提供全局...

Global site tag (gtag.js) - Google Analytics