1.单利模式:
1)概念:
一个类的实例在内存中有且仅有一个!
2)分类:
饿汉式:永远不会出现的一种单例模式
懒汉式:可能出现安全问题的一种单例模式
3)饿汉式:
??? 1.概念
饿汉式:
当类一加载,就,而且始创建了当前类对象终只有一个
??? 2.创建步骤:
1)自定义类:具体类
2)无参构造方法私有化,目的:外界不能创建对象了
3)在当前类的成员位置:创建自己本身对象
4)在当前类中提供一个对外的公共的静态的功能,返回值是它本身
??? 3.案例:
public class Student {//具体类
//成员位置:创建当前类的实例
// public static Student s = new Student() ; //
private static Student s = new Student() ;
//无参构造私有化
private Student(){}
//在当前类中提供一个对外的公共的静态的功能,返回值是它本身
public static Student getInstance(){
return s ;//静态只能访问静态
}
}
public class SingleObjectPattern {
public static void main(String[] args) {
/* Student s1 = new Student() ;
Student s2 = new Student() ;
//多例了;对象不同
System.out.println(s1==s2);
System.out.println(s1.getClass()==s2.getClass());*/ //获取字节码文件对象*/
//Student.s = null ;//没有意义:直接赋值空对象,不安全
Student s1 = Student.getInstance();
Student s2 = Student.getInstance();
Student s3 = Student.getInstance() ;
System.out.println(s1==s2) ;
System.out.println(s2==s3) ;
4)饿汉式:
???? 1.概念:
懒汉式:
可能出现安全问题的一种单例模式
1)懒加载 (延迟加载) Mybatis框架:延迟加载(用户表和账户表)
2)可能存在一种多线程安全问题
??? 2.创建步骤:
1)自定义类:具体类
2)无参构造方法私有化,外界不能创建当前类对象
3)需要在成员位置,声明当前类型的变量
4)提供一个对外公共的并且静态的访问方法,返回值就是当前类本身
??? 3.案例:
public class Teacher {//具体类
private static Teacher t ; //声明 默认值null
//无参构造方法私有化
private Teacher(){
}
//对外提供一个静态的公共访问方法,返回值是当前类本身
//每一个用户都需要请求getInstance():每一个用户相当于线程
//t1,t2,t3 都执行这个代码
/* public static Teacher getInstance(){ //静态的:锁对象:类名.class
synchronized (Teacher.class){//同步代码块
//先判断
//如果当前t变量为null,说明并没有创建当前类实例 (在使用的时候才创建)
if(t == null){
t = new Teacher() ; //创建对象
}
return t ;
}
}*/
//优化
public static synchronized Teacher getInstance(){ //静态的同步方法
//先判断
//如果当前t变量为null,说明并没有创建当前类实例 (在使用的时候才创建)
if(t == null){
t = new Teacher() ; //创建对象
}
return t ;
}
}
public class SingleObjectPattern2 {
public static void main(String[] args) {
//测试
Teacher t1 = Teacher.getInstance() ;
Teacher t2 = Teacher.getInstance() ;
System.out.println(t1== t2) ;
}
}
|