最近在看毕向东老师的java基础,学到了很多东西,在这里做一些笔记。
单例设计模式的应用场景,简单理解为用来创建不可变对象(一个内存只存在一个)。
保证对象唯一:
- 禁止其他程序创建(构造函数私有化)
- 为了其他程序访问,在本类中自定义对象(类中创建对象)
- 其他程序提供访问方式(public 方法访问)
有2种方式创建,懒汉式与饿汉式。
饿汉式
* 饿汉单例模式
*/
class Student {
//加载类是新建对象
private static Student s = new Student();
private int age;
public void setAge(int age) {
this.age = age;
}
public void getAge() {
System.out.println("age::::" + this.age);
}
private Student() {
}
public static Student getInstance() {
return s;
}
}
懒汉式
/**
* 懒汉单例模式
*/
class Student2 {
//加载类时对象为空
private static Student2 s2 = null;
private int age;
public void setAge(int age) {
this.age = age;
}
public void getAge() {
System.out.println("age::::" + this.age);
}
private Student2() {
}
public static Student2 getInstance() {
//多线程下会出问题,在方法上加synchronized,但效率低下,最优如下
if (s2 == null) {
synchronized (Student2.class) {
if (s2 == null) {
s2 = new Student2();
}
}
}
return s2;
}
}
所有代码,可以运行
public class SingleDemo {
public static void main(String[] args) {
Student s1 = Student.getInstance();
Student s2 = Student.getInstance();
s1.setAge(1);
s1.getAge();
s2.getAge();
Student2 s3 = Student2.getInstance();
Student2 s4 = Student2.getInstance();
s3.setAge(50);
s3.getAge();
s4.getAge();
}
}
/**
* 饿汉单例模式
*/
class Student {
//加载类是新建对象
private static Student s = new Student();
private int age;
public void setAge(int age) {
this.age = age;
}
public void getAge() {
System.out.println("age::::" + this.age);
}
private Student() {
}
public static Student getInstance() {
return s;
}
}
/**
* 懒汉单例模式
*/
class Student2 {
//加载类时对象为空
private static Student2 s2 = null;
private int age;
public void setAge(int age) {
this.age = age;
}
public void getAge() {
System.out.println("age::::" + this.age);
}
private Student2() {
}
public static Student2 getInstance() {
//多线程下会出问题,在方法上加synchronized,但效率低下,最优如下
if (s2 == null) {
synchronized (Student2.class) {
if (s2 == null) {
s2 = new Student2();
}
}
}
return s2;
}
}