当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

单例模式之学习

发表于: 2013-07-17   作者:dyrlgh   来源:转载   浏览次数:
摘要: 一、单例模式介绍          Singleton模式是一种建型模式,指某个类采用Singleton模式,则在这类类创建后,只能产生一个实便供外部访问。并且提供一个全局访问点。         全局对象和Singleton模式有本质的区别,因为大量的使用全局
一、单例模式介绍
    
    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

单例模式之学习

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
主要内容: 单例模式定义 单例模式优势 单例模式在Android源码中的应用 一、单例模式定义 单例模式
单例模式是使用最为普遍的模式之一。它属于创建模式,确保系统中该类型的类只被实例化一次。 也许有
单例模式确保一个类只有一个实例,而且自行实例化,向整个系统提供这个实例。它的三个特点: A.只能
单例模式(Singleton Pattern) 前面说提到的五种创建模式,主要解决的问题是如何创建对象,获得产
java设计模式之——单例模式 1,什么是单例模式? 单例模式确保一个类只有一个实例,自行提供这个实
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。 特点: 1,一个类只
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。 特点: 1,一个类只
单例模式:确保一个类只有一个实例,并提供一个全局访问点。 要想保证一个类只有一个实例,我们不能
概念:   java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式
java模式之单例模式: 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号