玩命加载中 . . .

单例模式(15)


单例模式(singleton pattern)

单例模式所具备条件:

  1. 构造方法私有化
  2. 对外提供一个公开的静态的获取当前对象的方法
  3. 提供当前类型的静态变量

单例模式分为两种:

  1. 懒汉式单例(推荐使用):

    当调用这个方法时候创建这个对象

    // 懒汉式单例
    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);        // 其他对象正常调用
        }
    }
    
  2. 饿汉式单例:

    未调用当前方法,这个对象就已经创建出来了

    // 饿汉式单例
    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);        // 其他对象正常调用
        }
    }
    

在实际开发中的作用:

  1. 在多个模块中都需要一个功能,为了节省空间,所以可以将这个功能做个单例设计模式,什么时候使用,都是创建一个对象
  2. 不会在堆内存中开辟多个空间

总结:

  • 优点:
    1. 单例模式特点是在一个类中只能创建一个对象
    2. 单例模式不会影响封装及多态中的使用,只针对与在对象创建时有且只能有一个对象
  • 缺点:
    1. 单例模式的类型无法被继承
      因为单例模式构造方法是私有的所以一旦继承,子类构造函数默认会调用super(),但是由于单例模式的构造方法是private(私有)所以子类无法访问到父类的构造方法
    2. 待总结...

文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
 上一篇
访问控制权限修饰符(14) 访问控制权限修饰符(14)
访问控制权限修饰符 访问控制权限修饰符来控制元素的访问范围 访问控制权限修饰符: 修饰符 权限解释 public(公共的) 表
2021-06-08
下一篇 
super关键字(16) super关键字(16)
super关键字 super不是引用类型,,super中存储的不是内存地址,,super指向的不是父类对象 super代表的是前子类对象中
2021-06-08
  目录