码迷,mamicode.com
首页 > 编程语言 > 详细

java单例模式

时间:2015-04-10 13:11:43      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
  单例模式有一下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

//饿汉式单例类.在类初始化时,已经自行实例化 
 public class Singleton1 {
     //私有的默认构造子
     private Singleton1() {}
     //static 修饰  类初始化时创建唯一实例 
     private static final Singleton1 single = new Singleton1();
     //静态工厂方法 
     public static Singleton1 getInstance() {
         return single;
     }
 }

 

//懒汉式单例类.在第一次调用的时候实例化 
 public class Singleton2 {
     //私有的默认构造子
     private Singleton2() {}
     //注意,这里没有final    
     private static Singleton2 single=null;
     //静态工厂方法 
     public synchronized  static Singleton2 getInstance() {
          if (single == null) {  
              single = new Singleton2();
          }  
         return single;
     }
 }

 

import java.util.HashMap;
import java.util.Map;

//登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的
//类似Spring里面的方法,将类名注册,下次从里面直接获取。

public class RegSingleton {
    private static Map<String, RegSingleton> map = new HashMap<String, RegSingleton>();

    static {
        RegSingleton single = new RegSingleton();
        map.put(single.getClass().getName(), single);
    }

    //默认构造 保护
    protected RegSingleton() {
    }

    //静态工厂方法,返还此类惟一的实例
    public static RegSingleton getInstance(String name) {
        if (name == null) {
            name = RegSingleton.class.getName();
        }
        if (map.get(name) == null) {
            try {
                map.put(name, (RegSingleton) 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) {
        RegSingleton single = RegSingleton.getInstance(null);
        System.out.println(single.about());
        System.out.println(RegSingletonChild.getInstance().about());
    }

}

 

public class RegSingletonChild extends RegSingleton {

    public RegSingletonChild() {
    }

    /**
     * 静态工厂方法
     */
    static public RegSingletonChild getInstance() {
        return (RegSingletonChild)RegSingleton.getInstance(RegSingletonChild.class.getName());
    }

    public String about() {
        return "Hello, I am RegSingletonChild.";
    }

}

 

java单例模式

标签:

原文地址:http://www.cnblogs.com/iiot/p/4414093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!