zoukankan      html  css  js  c++  java
  • Singleton单例模式

    Singleton单例模式,该设计模式经常在项目开发中使用,它用于创建一个全局共享的实例对象。该实例对象在整个应用程序中只有一个,不会出现更多的该类实例对象。

    实现原理就是将类的构造方法私有化,也就是使用private修饰符来修饰构造方法,这样外部就不能使用构造方法来创建对象了。但是本类内部还是可以创建对象的,所以,可以创建一个本类类型的成员变量来保存本类的唯一对象,然后提供属性访问器方法来获取这个唯一的实例,但是每次获取的实例都是同一个对象,而不是重新创建的

    首先创建CurrentUser类

    /**
     * 当前登录用户类
     * @author Skyar
     */
    public class CurrentUser {
        private String name;
        private int id;
        private int level = 1;
        /**
         *本类的唯一实例。创建成员常量instance来保存本类的唯一对象
         *然后提供属性访问器方法来获取这一唯一的实例
         *但是每次获取实例都是同一个对象,而不是重新创建的    
         */
        private static final CurrentUser instance = new CurrentUser();
        /**
         * 私有化的构造方法
         */
        private CurrentUser(){
            //把构造方法私有化,这样外部就不能使用构造方法创建对象了,但是本类中可以创建对象的
        }
        
        /**
         * 获取实力的唯一方法,每次获取的实例都是同一对象
         * 因为实例只创建一次,并保存在成员变量instance中
         * @return the instance
         */
        public static CurrentUser getInstance() {
            return instance;
        }
        /**
         * 获取用户名
         * @return the name
         */
        public String getName() {
            return name;
        }
        /**
         * 设置用户名
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        /**
         * 获取用户ID
         * @return the id
         */
        public int getId() {
            return id;
        }
        /**
         *设置用户ID
         * @param id the id to set
         */
        public void setId(int id) {
            this.id = id;
        }
        /**
         * @return the level
         */
        public int getLevel() {
            return level;
        }
        /**
         * @param level the level to set
         */
        public void setLevel(int level) {
            this.level = level;
        }
        
        
    }

    创建ManagerUser管理员类

    /**
     * 管理员用户类
     * @author Skyar
     */
    public class ManagerUser {
        private String name;
        private int id;
        private int level = 1;
        /**
         * 本类的唯一实例,用instance来保存本类的唯一实例
         * 然后用属性器获取唯一实例instance
         * 每次获取的都是同一实例,而不是重新创建的
         */
        private static ManagerUser instance = null;
        
        /**
         * 私有化构造函数
         * 外部不能用构造函数来创建对象
         */
        private ManagerUser(){
            //构造函数初始化
        }
        /**
         * 获取实力的唯一方法
         * 首次实例化ManagerUser类的时候会创建实例
         * 以后再次实例化的时候就不会创建实例,直接返回最开始的实例了
         * 即每次获取的实例都一样,不会重新创建实例
         * @return the instance
         */
        public static ManagerUser getInstance() {
            if(instance == null){
                instance = new ManagerUser();
            }
            return instance;
        }
        /**
         * 获取管理员名
         * @return the name
         */
        public String getName() {
            return name;
        }
        /**
         * 设置管理员名
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        /**
         * 获取管理员ID
         * @return the id
         */
        public int getId() {
            return id;
        }
        /**
         * 设置管理员ID
         * @param id the id to set
         */
        public void setId(int id) {
            this.id = id;
        }
        /**
         * @return the level
         */
        public int getLevel() {
            return level;
        }
        /**
         * @param level the level to set
         */
        public void setLevel(int level) {
            this.level = level;
        }
    
    }

    创建主类SingletonDemo,在主方法中实现单例模式:

    public class SingletonDemo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            CurrentUser userA = CurrentUser.getInstance();                    //获取一个用户A
            userA.setId(29);                                                //初始化用户A
            userA.setLevel(5);
            userA.setName("lily");
            
            CurrentUser userB = CurrentUser.getInstance();                    //获取一个用户B
            userB.setName("Skyar");                                            //设置B的用户名
            
            System.out.println("当前用户A:" + userA.getName());
            
            
            ManagerUser managerA = ManagerUser.getInstance();                //获取一个管理员A
            managerA.setId(1);                                                //初始化管理员A
            managerA.setLevel(1);
            managerA.setName("论坛管理员");
            
            ManagerUser managerB = ManagerUser.getInstance();                //获取一个管理员B
            managerB.setName("超级管理员");                                    //设置管理员B的用户名
            
            System.out.println("当前管理员A:" + managerA.getName());
    
        }
    
    }

    运行结果:

    在实例的主方法中分别创建并初始化了用户A和管理员A,也分别设置了名称。但是在创建用户B和管理员用户B并设置它们的名称后,导致用户A和管理员A的名称改变,这说明用户A和用户B是同一个对象,管理员A和管理员B也是同一个对象

  • 相关阅读:
    Mysql Window 解压版卸载
    maven jdk 版本配置
    单点登录原理与简单实现
    JAVA HASHMAP的死循环
    Intellij IDEA 4种配置热部署的方法
    springmvc 返回 404 解决
    设计模式 -- 模版模式
    安装Oracle Database 11g 找不到文件“WFMLRSVCApp.ear” .
    红黑树 -- 增删查改
    TIJ -- CountDownLatch
  • 原文地址:https://www.cnblogs.com/Skyar/p/3037250.html
Copyright © 2011-2022 走看看