单例模式
所谓的单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
单例模式有两种方式:饿汉式 懒汉式
步骤[单例模式-饿汉式]
1.将构造器私有化
2.在类的内部直接构建
3.提供一个公共的static方法,返回对象
public class Ch01 {
public static void main(String[] args) {
GirlFriend instance1 = GirlFriend.getInstance();
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance1);
System.out.println(instance1==instance2);
}
}
class GirlFriend{
private String name;
private static GirlFriend girlFriend=new GirlFriend("小红花");
private GirlFriend(String name){
this.name=name;
}
public static GirlFriend getInstance(){
return girlFriend;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
运行结果
步骤[ 单例 模式-懒汉式]
1.将构造器私有化
2.在类的内部直接构建
3.提供一个公共的static方法,返回对象
4.懒汉式,只有当用户使用getInstance时,才返回对象,后面再次调用时,会返回上次调用的对象
从而保证的了单例
public class Ch02 {
public static void main(String[] args) {
System.out.println(Cat.age);
System.out.println(Cat.getInstance());
System.out.println(Cat.getInstance());
}
}
class Cat{
public static int age=2;
private String name;
private static Cat cat;
private Cat(String name){
System.out.println("调用构造器");
this.name=name;
}
public static Cat getInstance(){
if(cat==null){
cat=new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
运行结果
饿汉式和懒汉式的区别
1.二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是使用时才创建
2.饿汉式不存在线程安全问题,懒汉式存在线程安全问题,在线程后会完善
3.饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题
4.在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式