1.创建一个Student类
public class Student { //学生的实体类
private String name; //姓名
private int age; //年龄
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.创建测试类
public class SingletonTest {
public static void main(String[] args) {
//创建第一个学生对象
Student stu1=new Student("学生1", 21);
//创建第二个学生对象
Student stu2=new Student("学生2", 22);
//输出对应学生的信息
System.out.println("学生1的姓名:"+stu1.getName());
System.out.println("学生2的姓名:"+stu2.getName());
System.out.println("***************************");
}
}
3.运行查看结果
/*
* 在项目中 只想让Student这个类 实例化一次!也就是整个程序中只有一个对象!
* 操作的所有Student对象 都是一个!
*
* 单例模式: 保证整个系统中一个类 只有一个实例!而且这个实例只能是自身创建!
* 外部不能直接创建对象! 不能new ! 只能通过类中的固定方法获取!
*
* 01.懒汉式
* 02.饿汉式
* 03.双重锁
*
*/
4.创建SingletonStudent实体类
public class SingletonStudent { //懒汉式
//01.创建了一个类型是本类对象的静态属性
private static SingletonStudent student=null;
private String name;
private int age;
//02.构造私有化
private SingletonStudent() {
}
//03.提供外部访问的接口 返回当前类的对象
public static synchronized SingletonStudent getInstance(){
if (student==null) {
student=new SingletonStudent();
}
return student;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
5.在测试类中增加代码
//通过SingletonStudent类中提供的方法来构造实例
SingletonStudent student1=SingletonStudent.getInstance();
//给第一个学生的年龄和姓名赋值
student1.setAge(50);
student1.setName("小黑");
SingletonStudent student2=SingletonStudent.getInstance();
//给第二个学生的年龄赋值
student2.setAge(55);
System.out.println(student1.getAge());
System.out.println(student2.getName());
System.out.println(student1==student2); //true
6.运行查看结果后发现 student1和student2其实就是一个对象!实现了单例
7.饿汉式实现单例 创建实体类SingletonStudent2
public class SingletonStudent2 { //饿汉式
//01.创建一个自己的实例 仅供自身访问
private static SingletonStudent2 student=new SingletonStudent2();
private String name;
private int age;
//02.构造私有化
private SingletonStudent2() {
}
//03.提供外部访问的接口 返回当前类的对象
public static synchronized SingletonStudent2 getInstance(){
return student;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
8.在测试类中增加测试代码 运行查看效果 还是单例
@Test// 02.饿汉式
public void test02(){
//通过SingletonStudent2类中提供的方法来构造实例
SingletonStudent2 student1=SingletonStudent2.getInstance();
//给第一个学生的年龄和姓名赋值
student1.setAge(50);
student1.setName("小黑");
SingletonStudent2 student2=SingletonStudent2.getInstance();
//给第二个学生的年龄赋值
student2.setAge(55);
System.out.println(student1.getAge());
System.out.println(student2.getName());
System.out.println(student1==student2); //true
}
9.双重锁的机制实现单例 创建实体类
public class SingletonStudent3 { //双重锁
//01.创建了一个类型是本类对象的静态属性
private static SingletonStudent3 student=null;
private String name;
private int age;
//02.构造私有化
private SingletonStudent3() {
}
//03.提供外部访问的接口 返回当前类的对象
public static synchronized SingletonStudent3 getInstance(){
if (student==null) {
synchronized (SingletonStudent3.class) { //再次加锁
if (student==null) {
student=new SingletonStudent3();
}
}
}
return student;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
10.在测试类中增加测试代码 运行查看效果 还是单例
@Test//03.双重锁
public void test03(){
//通过SingletonStudent2类中提供的方法来构造实例
SingletonStudent3 student1=SingletonStudent3.getInstance();
//给第一个学生的年龄和姓名赋值
student1.setAge(50);
student1.setName("小黑");
SingletonStudent3 student2=SingletonStudent3.getInstance();
//给第二个学生的年龄赋值
student2.setAge(55);
System.out.println(student1.getAge());
System.out.println(student2.getName());
System.out.println(student1==student2); //true
}