1.什么是单例模式?
类的单例的设计模式,就是在定义某一个类时它只能有一个对象,并且这个类只提供一个取得对对象实例的方法
就好比说,在我们生活当中只能有一个女朋友。
但是呢,在我们创建的时候都不能说保证只能new一个对象
class A{
public static void main(String[] args){
B c =new B("张三");
B C1 =new B("李四");
//在这个时候我们发现可以new两个对象或者多个
}
}
class B{
String name;
public B(String name){
this.name = name;
}
}
上面的代码的已经不满足单例模式只能存在了,那我们可以通过单例模式的常用两个模式来实现:饿汉式、懒汉式
1.1 饿汉式
饿汉式步骤分为这几种:
1.先将构造器私有化,这样可以让用户不能在外部随意new对象
2.在类的里面的属性中创建对象,既然我们构造器私有化了,那我们的外部就没办法new对象,所以说我们只能在类的里面创建对象了
3.向外面提供一个公共的静态方法,创建好对象后,如果说不对外部提供公共方法,我们仍然没办法使用这个被创建的对象
思路:既然说我们将构造器私有后就没办法new对象,那么我们是不是能通过类名加载来获取呢。然后我们通过static关键词来实现对外公共方法,因为这个方法需要返回创建对象,而静态方法只能使用静态变量,所以我们这得用static
代码如下
class A{
public static void main(String[] args){
//创建两个对象
Teacher teacher01 = Teacher.getTeacher();
Teacher teacher02 = Teacher.getTeacher();
//输出两个对象,这儿会发现他们两个一样
System.out.println(teacher01);
System.out.println(teacher02);
}
}
class Teacher{
//这里我们new一个对象,因为不能让外面访问到所以得私有化,
private static final Teacher TEACHER = new Teacher();
private Teacher(){
}
public static Teacher getTheacher(){
return TEACHER;
}
}
这儿会有个疑问,明明时两个对象为什么输出的一样呢,其实在我们在new对象的时候因为static静态代码他是只能运行一次的,所以我们根据这个特点将值给定死了,这儿后期会出
懒汉式
懒汉式的步骤分
为这几种:
1.同样将构造器私有化,让用户不能在外部随便new对象
2.在类中属性部分先声明对象但时不创建
3.向外部提供一个公共的静态方法,用来创建对象返回对象引用
思路:这里的思路跟饿汉式一摸一样,唯一不同的的,我们需要在提供公共方法里面创建对象,要在方法中创建同一个对象,声明对象为null,判断不是null,就直接返回上次创建的对象
class A{
public static void main(String[] args){
Students student01 = Students.grtStudents();
Students student02 = Students.getStudents();
System.out.println(student01);
System.out.println(student02);
}
}
class Students{
private static Students ATUDENTS = null;
private Students(){
}
public static Students getStudents(){
if(STUDENTS==null){
STUDENTS = new Students();
}
return STUDENTS;
}
}
它们两个的区别在于创建对象的时机不同,饿汉式实在类加载的时候就创建了对象,线程安全。懒汉式在使用时创建,线程线程不安全。
而且饿汉式存在浪费资源的可能。