单例设计模式
概念
- 静态方法和属性的使用
- 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。
- 类的单例模式就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,且该类只能提供一个取得对象实例的方法。
单例模式两种方式
饿汉式
- 构造器私有化(防止直接实例化对象)
- 类的内部创建对象(对象是静态的)
- 向外暴露一个静态的公共方法(返回对象)
饿汉式
public class SingleTon {
public static void main(String[] args) {
System.out.println(GirlFriend.num);//使用静态变量会导致类被加载
GirlFriend instance = GirlFriend.getInstance();
System.out.println(instance);
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2);
System.out.println(instance == instance2);
}
}
class GirlFriend{
public static int num=10;
private String name;
private static GirlFriend gf= new GirlFriend("rose");
private GirlFriend(String name) {
this.name = name;
}
public static GirlFriend getInstance(){
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
弊端:可能造成创建对象但是没有使用;导致资源浪费
懒汉式
- 构造器私有化
- 定义一个static静态属性对象
- 提供一个public的static方法,可以返回一个对象
- 只有用户使用getInstance时才返回对象,再次调用时返回上次创建的对象
懒汉式
public class SingleTon {
public static void main(String[] args) {
System.out.println(Cat.num);// 测试是否创建对象
Cat instance = Cat.getInstance();
System.out.println(instance);
Cat instance2 = Cat.getInstance();
System.out.println(instance2);
System.out.println(instance == instance2);
}
}
class Cat {
public static int num=10;
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 + '\'' +
'}';
}
}
懒汉式与饿汉式的区别
- 二者主要区别在于创建对象的时机不同,饿汉式是在类加载时创建对象,懒汉式则是使用时才创建。
- 饿汉式不存在线程安全问题,懒汉式存在线程安全问题
- 饿汉式存在浪费资源的可能。
在JavaSE标准类中java.lang.Runtime
是一个经典的单例模式(饿汉式)。