单例设计模式
正常情况下一个类可以创建多个对象
1 public static void main(String[] args) { 2 // 正常情况下一个类可以创建多个对象 3 Person p1 = new Person(); 4 Person p2 = new Person(); 5 Person p3 = new Person(); 6 }
1. 单例设计模式的作用
单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,应用该模式的这个类只有一个实例。即一个 类只有一个对象实例。
2. 单例设计模式实现步骤
1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
3. 定义一个静态方法返回这个唯一对象。
3. 单例设计模式的类型
根据实例化对象的时机单例设计模式又分为以下两种:
1. 饿汉单例设计模式
2. 懒汉单例设计模式
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. 小结
单例模式可以保证系统中一个类只有一个对象实例。
实现单例模式的步骤:
1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
3. 定义一个静态方法返回这个唯一对象。
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); } }