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也是同一个对象

原文地址:https://www.cnblogs.com/Skyar/p/3037250.html