单例设计模式:
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
单例模式有两种方式:(不管是哪一种,因为提供的方法是static的,所以构造器只调用了一次,也就是说只创建了一次对象,后面在用该方法提出的对象,和前面的对象是在同一个地址池中)
1.饿汉式:
public class Test2 {
public static void main(String[] args) {
System.out.println(DD.getInstance());
}
}
//单例模式-饿汉式
//为什么叫饿汉式,是因为用了着中方法,该对象不管你有没有用,只要类加载了,那么这个对象也就创建好了
//1.将构造器私有化
//2.在类的内部直接创建对象(该对象是static)
//3.提供一个公共的static方法,返回该对象
class DD{
//先设置一个成员变量
private Strin name ;
//创建一个static对象,为了能够在静态方法中,返回该对象,需要将其修饰为static
private static DD dd = new DD("张三");
//私有化构造器
private DD(String name){
this.name = name;
}
//提供了一个static方法,用来返回该对象
public static DD getInstance(){
return dd;
}
//如果没有toString,那么在main方法中,得到的是地址,加上以后就会返回该对象的内容
@Override
public String toString() {
return "DD{" +
"name='" + name + '\'' +
'}';
}
}
饿汉式因为在类的加载时就会创建对象,如果后面的程序中没有用到该对象,那么就会存在着浪费资源。
2.懒汉式
public class Test2 {
public static void main(String[] args) {
DD instance = DD.getInstance();
System.out.println(instance);
DD instance2 = DD.getInstance();
System.out.println(instance2);
}
}
//单例模式-懒汉式
//1.将构造器私有化
//2.在类的内部直接创建对象(该对象是static)
//3.提供一个公共的static方法,返回该对象
//4.懒汉式,只有当客户使用getInstance时,才放回cat对象,后面再次调用时,会返回上次创建的cat对象
//从而保证了单例
class DD{
//先设置一个成员变量
private String name ;
//创建一个static对象,为了能够在静态方法中,返回该对象,需要将其修饰为static
private static DD dd ;
//私有化构造器
private DD(String name){
System.out.println("构造器调用");
this.name = name;
}
//提供了一个static方法,用来返回该对象
public static DD getInstance(){
if (dd == null){//在这里进行判断,第一次客户使用getInstance时创建对象,后面在使用时,是返回第一次创建的对象
dd= new DD("张三");
}
return dd;
}
//如果没有toString,那么在main方法中,得到的是地址,加上以后就会返回该对象的内容
@Override
public String toString() {
return "DD{" +
"name='" + name + '\'' +
'}';
}
}
区别:
1.二者最主要的区别在于创建对象的时机不同:饿汉式是在加载就创建了对象实例,而懒汉式式在使用时才创建。
2.饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
3.饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有用到,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
4.我们学习的javaSE标准中,java.lang.Runtime就是经典的单例模式。