单例模式
采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
饿汉式实现单例模式
class SingleTon {
private String name;
// get,set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// step1: 将所有构造器私有化,防止类外创建对象
private SingleTon() {}
private SingleTon(String name) {
this.name = name;
}
// step2: 在类的内部创建对象,因为要提供一个公共的方法返回这个对象,那么将这个对象封装成private
// step3: 在static的方法中只能使用static的属性或方法,所以给这个对象追加static
private static SingleTon obj = new SingleTon();
// step3: 提供公共方法返回该对象
// 如何调用该方法? 通常使用"对象.方法"调用,但是单例模式就创建一个对象,而这个方法是返回这个对象的,
// 所以用"类名.方法"调用,将该方法声明为static
public static SingleTon getObj() {
return obj;
}
public static void main(String[] args) {
SingleTon obj1 = SingleTon.getObj();
SingleTon obj2 = SingleTon.getObj();
System.out.println(obj1 == obj2); // true
}
}
懒汉式实现单例模式
class SingleTon2 {
private SingleTon2() {}
private static SingleTon2 obj = null;
// 线程不安全的写法:
// public static SingleTon2 getObj() {
//
// if (obj == null) {
// obj = new SingleTon2();
// }
//
// return obj;
// }
// 安全写法一: 同步方法
// public static synchronized SingleTon2 getObj() {
//
// if (obj == null) {
// obj = new SingleTon2();
// }
//
// return obj;
// }
// 安全写法二: 同步代码快
public static SingleTon2 getObj() {
// 用synchronized代码块对所有对象共享数据obj进行包裹
// synchronized (SingleTon2.class) {
// if (obj == null) {
// obj = new SingleTon2();
// }
//
// return obj;
// }
// 但是上面的写法效率稍差,比如,第一个对象创建的时候,还没有obj,它创建了,
// 那么其他对象再创建的时候,就没有必要每次都要判断赋值了,所以在此基础上,加一个判断
// 有了obj对象以后,其他新创建的对象就直接获取就行了
if (obj == null) {
synchronized (SingleTon2.class) {
if (obj == null) {
obj = new SingleTon2();
}
}
}
return obj;
}
}