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(){
}
}