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