javaSE复习之——设计模式_单列设计模式

概述

单列设计模式就是保证某个类只能被创建一个对象

如何保证这个类在内存中只有一个对象呢?

1、私有化它的构造方法,不让别的类访问这个类

2、在这个类中定义一个本类的对象,并且将它私有化、静态化、并且用最终修饰符修饰。

3、创建一个静态的get方法返回对这个对象的引用

代码示例1(饿汉式)

1
2
3
4
5
6
7
8
9
10
11
class Singleton {
//1、私有构造方法不让别人访问
private Singleton() {}
//2、创建本类对象让别人访问
private static final Singleton s = new Singleton();
//3、创建个体方法
public static Singleton getInstance() {
return s;
}
}

为什么叫饿汉式?

因为类一加载就要创建对象,比喻一个饿汉一上来就要吃,吃的东西也就是new的这个对象。

  • ps:
    其实get方法都可以不需要创建,因为引用对象的成员变量是用final修饰的,直接调用即可,当然这样就不是饿汉式了,而是第三种格式。

代码示例2(懒汉式)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Singleton {
//1、私有构造方法不让别人访问
private Singleton() {}
//2、创建声明引用
private static Singleton s ;
//3、创建个体方法
public static Singleton getInstance() {
if(s == null) {
s = new Singleton();
}
return s;
}
}

ps:因为它比较懒,要用到的时候才去创建,所以叫懒汉式,但是平时开发不用懒汉式,而用饿汉式。

为什么平时用饿汉式?

  • 答:

    因为虽然懒汉式不会浪费空间内存,但是他会有线程安全问题

    • 举个例子:
      当我线程1和线程2要获取这个类,当cpu执行的线程1刚好判断进去创建对象的时候,突然cpu又去执行线程2了,当cpu执行完线程2的时候已经创建好了一个对象,这时cpu又回来执行线程1,那么就创建了两个对象,所以它会又线程安全问题。

那懒汉式什么时候用?

  • 答:

    面试的时候!面试的时候会出一个“请写出一个单例的延迟加载模式”,那么这个时候其实就是让我们写懒汉模式。

两种单例模式实现的区别

1、饿汉式它是空间换时间

  • 解析:
    因为一上来就直接创建对象,要用的时候直接调用,所以要用的时候速度相对更快

2、懒汉式它是时间换空间

  • 解析:
    因为一上来它不创建对象,而要用的时候先判断再创对象,而且以后每次需要用都要判断,所以浪费了时间

3、在多线程访问时,饿汉式绝对不会创建多个对象,而懒汉式就会存在线程安全问题,会创建多个对象

Runtime类概述:

每个java程序都有一个Runtime类,它与运行环境相连接,它就是是使用的单例设计模式

Runtime是的应用场景

当我们需要执行cmd之类的命令的时候就可以勇担Runtime中的exec方法