java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。总之,选择单例模式就是为了避免不一致状态。
单列模式分为懒汉式和饿汉式(使用的是懒汉式,需要时构造,饿汉式构造实例时加final)
public class Singleton {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//该类的私有无参构造方法
Singleton(){};
//创建这个类的实例(由于构造对象私有,只能通过该类的方法获取类的对象,所以用static)
//这里使用的是懒汉式,饿汉式加final
private static Singleton test1 = null;
//自动向整个系统提供这个实例对象
public static Singleton getSingleton() {
if (test1==null) {
test1 = new Singleton();
}
return test1;
}
public void getInfo() {
System.out.println("output message is"+ name);
}
}
public class TestSignalton {
public static void main(String[] args) {
Singleton test1 = Singleton.getSingleton();
test1.setName("单列模式1");
Singleton test2 = Singleton.getSingleton();
test1.setName("单列模式2");
test1.getInfo();
test2.getInfo();
if (test1==test2) {
System.out.println("创建的是同一个实例");
}else if (test1!=test2) {
System.out.println("创建的是不同的实例");
}else {
System.out.println("运行错误");
}
}
}
运行结果:
output message is单列模式2
output message is单列模式2
创建的是同一个实例
登记式是将{类名,类}放入到map中,使用protected构造方法,同时提供静态工厂方法,返回此类的唯一实例。
//登记式单列模式,将类名注册
public class dengjiSingleton {
private static Map<String, dengjiSingleton> map = new HashMap<String, dengjiSingleton>();
static{
dengjiSingleton singleton = new dengjiSingleton();
map.put(singleton.getClass().getName(), singleton);
}
//构造方法
protected dengjiSingleton(){};
//静态工厂方法,返回此类的唯一实例
public static dengjiSingleton getInstance(String name) {
if (name==null) {
name= dengjiSingleton.class.getName();
System.out.println("name==null"+"--->name"+name);
}
if (map.get(name)==null) {
try {
map.put(name, (dengjiSingleton) Class.forName(name).newInstance());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return map.get(name);
}
//方法示例
public String about() {
return "Hello,I am Resingleton";
}
public static void main(String[] args) {
dengjiSingleton singleton = dengjiSingleton.getInstance(null);
System.out.println(singleton.about());
}
}
运行结果:
name==null—>namecn.lianxi.dengjiSingleton
Hello,I am Resingleton
(当没有这个类名时创建类)