单例模式(singleton pattern)
单例模式所具备条件:
- 构造方法私有化
- 对外提供一个公开的静态的获取当前对象的方法
- 提供当前类型的静态变量
单例模式分为两种:
懒汉式单例(推荐使用):
当调用这个方法时候创建这个对象
// 懒汉式单例 public class User { // 静态变量: private static User user; int a; // 构造方法私有化 private User() { } // 对外提供一个公开获取User的方法 public static User getInstance() { if (user==null) { user = new User(); user.a=100; } return user; } } // test class UserTest{ public static void main(String[] args) { User user1 = User.getInstance(); // 单例模式创建方法 User user2 = User.getInstance(); System.out.println(user1==user2); // -----> true 当前引用地址指向的相同 System.out.println(user2.a); // 其他对象正常调用 } }
饿汉式单例:
未调用当前方法,这个对象就已经创建出来了
// 饿汉式单例 class User2 { // 因为这是一个静态变量所以当调用这个类时候当前这个对象就已经创建出来了 private static User2 user2 = new User2(); int a; // 构造方法私有化 private User2() { } // 对外提供一个公开获取User的方法 public static User2 getInstance() { // 这里直接返回user2,因为静态方法已经创建出来对象了 user2.a=200; return user2; } } class UserTest{ public static void main(String[] args) { User2 user3 = User2.getInstance(); // 单例模式创建方法 User2 user4 = User2.getInstance(); System.out.println(user3==user4); // -----> true 当前引用地址指向的相同 System.out.println(user3.a); // 其他对象正常调用 } }
在实际开发中的作用:
- 在多个模块中都需要一个功能,为了节省空间,所以可以将这个功能做个单例设计模式,什么时候使用,都是创建一个对象
- 不会在堆内存中开辟多个空间
总结:
- 优点:
- 单例模式特点是在一个类中只能创建一个对象
- 单例模式不会影响封装及多态中的使用,只针对与在对象创建时有且只能有一个对象
- 缺点:
- 单例模式的类型无法被继承
因为单例模式构造方法是私有的所以一旦继承,子类构造函数默认会调用super(),但是由于单例模式的构造方法是private(私有)所以子类无法访问到父类的构造方法 待总结...
- 单例模式的类型无法被继承