java单例模式

1什么是单例模式?

单例模式是一种常见的软件设计模式.

2单例模式的特点:2.1只有一个实例.

2.2单例类必须自己创建自己的唯一实例.

2.3单例类必须为其他类提供自己的唯一实例.

3分类:3.1懒汉式单例模式,3.2饿汉式单例模式,3.3登记式单例模式4其他单例模式

3.1.1懒汉式单例模式(线程不安全)

 

package lazysingleton;

/**
 *@author kira_j
 *线程不安全的懒汉型单例模式
 */
public class Singleton {
    private static Singleton instance;
    private  Singleton(){

    }
    public static Singleton getInstance(){
        if (instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

 

 3.1.2线程安全的懒汉单例模式

package lazysingleton_sys;

/**
 * @author kira_j
 * 线程安全适合多线程的懒汉型单例模式
 */
public class Singleton {
    private  static Singleton instance;
    private Singleton(){

    }
    synchronized public static Singleton getInstance(){
        if (instance==null){
            instance=new Singleton();
        }
        return  instance;
    }
}

 3.1.3含有静态内部类的懒汉型单例模式

package lazysingleton_inner;

/**
 * @autor kira_j
 * 静态内部类(懒汉的变种)
 */
public class Singleton {
    private  static class SingletonInstanceHolder{
        private static final Singleton instance=new Singleton();
    }
    private Singleton(){

    }
    public static Singleton getInstance(){
        return SingletonInstanceHolder.instance;
    }
}

  

3.2.1饿汉型单例模式

package eagersingleton;

/**
 * @author kira_j
 * 
 */
/*public class Singleton {
    private  static Singleton instance=new Singleton();
    private  Singleton(){

    }
    public static Singleton getInstance(){
        return  instance;
    }

}*/

public class Singleton{
    private  static Singleton instance;
    static{
        instance=new Singleton();
    }
    private  Singleton(){
        
    }
    public static  Singleton getInstance(){
        return instance;
    }
}

 缺点:类一加载就初始化,容易占用内存。

3.3登记式单例模式

 

 

package regsingleton;

import java.util.HashMap;

/**
 * 登记式单例模式
 */
public class Singleton {
    private static HashMap map;
    private static Singleton instance;
    static{
        map=new HashMap();
        instance=new Singleton();
        map.put(instance.getClass().getName(),instance);

    }
    private Singleton(){

    }
    public static Singleton getInstance(String name){
        if (name==null){
            name=instance.getClass().getName();
        }
        if (map.get(name)==null){
            try {
                map.put(name,Class.forName(name).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return (Singleton) map.get(name);
    }
}

 其他类型的单例模式

 4.1

package singleton_enum;

/**
 * 枚举
 */
public enum Singleton {
    INSTANCE;
    public void whatEverMethod(){

    }
}

 

你可能感兴趣的:(单例模式,饿汉单例模式,懒汉单例模式)