单例设计模式
正常情况下一个类可以创建多个对象
public static void main(String[] args) {
// 正常情况下一个类可以创建多个对象
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
}
1. 单例设计模式的作用
单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,应用该模式的这个类只有一个实例。即一个 类只有一个对象实例。
2. 单例设计模式实现步骤
-
将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
-
在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
-
定义一个静态方法返回这个唯一对象。
3. 单例设计模式的类型
根据实例化对象的时机单例设计模式又分为以下两种:
-
饿汉单例设计模式
-
懒汉单例设计模式
4. 饿汉单例设计模式
饿汉单例设计模式就是使用类的时候已经将对象创建完毕,不管以后会不会使用到该实例化对象,先创建了再说。很 着急的样子,故被称为“饿汉模式”。
代码如下:
public class Singleton {
// 1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
private Singleton() {}`在这里插入代码片`
// 2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
private static final Singleton instance = new Singleton();
// 3.定义一个静态方法返回这个唯一对象。
public static Singleton getInstance() {
return instance;
}
}
5. 懒汉单例设计模式
懒汉单例设计模式就是调用getInstance()方法时实例才被创建,先不急着实例化出对象,等要用的时候才例化出对 象。不着急,故称为“懒汉模式”。
public static void main(String[] args) {
// 正常情况下一个类可以创建多个对象
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
}
public class Singleton {
// 1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
private Singleton() {}
// 2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
private static final Singleton instance = new Singleton();
// 3.定义一个静态方法返回这个唯一对象。
public static Singleton getInstance() {
return instance;
}
}
6. 小结
单例模式可以保证系统中一个类只有一个对象实例。
实现单例模式的步骤:
-
将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
-
在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
-
定义一个静态方法返回这个唯一对象。
7. 示例代码:
// 定义音乐播放器单例(饿汉式)
class AudioPlayer {
// 1.将构造方法私有
private AudioPlayer() {
}
// static的成员变量是在类加载的时候就会创建好(早)
// 2.本类自己创建一个对象,使用静态的成员变量来保存
private static AudioPlayer player = new AudioPlayer();
// 3.提供一个方法,返回这个唯一的对象给别人使用
public static AudioPlayer getInstance() {
return player;
}
}
// 视频播放器(懒汉式)
class VideoPlayer {
// 1.将构造方法私有
private VideoPlayer() {
}
// 2.本类自己创建一个对象,使用静态的成员变量来保存
private static VideoPlayer player;
// 3.提供一个方法,返回这个唯一的对象给别人使用
public static VideoPlayer getInstance() {
// 如果对象还没有值
if (player == null) {
// 就创建一个对象
player = new VideoPlayer();
}
// 懒汉式存在线程安全问题.后面会学多线程,会解决线程安全问题
return player;
}
}
public class Demo {
public static void main(String[] args) {
AudioPlayer a1 = AudioPlayer.getInstance();
AudioPlayer a2 = AudioPlayer.getInstance();
AudioPlayer a3 = AudioPlayer.getInstance();
System.out.println("a1 = " + a1);
System.out.println("a2 = " + a2);
System.out.println("a3 = " + a3);
// 视频播放器(懒汉式)
VideoPlayer vp1 = VideoPlayer.getInstance();
VideoPlayer vp2 = VideoPlayer.getInstance();
VideoPlayer vp3 = VideoPlayer.getInstance();
System.out.println("vp1 = " + vp1);
System.out.println("vp2 = " + vp2);
System.out.println("vp3 = " + vp3);
}
}