黑马程序员技术交流社区

标题: 关于单例设计模式,分享一个例子 [打印本页]

作者: mtdanz    时间: 2014-9-27 19:03
标题: 关于单例设计模式,分享一个例子
看视频的时候,单例设计模式老师讲了一下实现方法,关于它应用的例子老师一句话提到过,说是需要不同的对象需要访问和修改配置信息,而配置信息有些时候不能直接通过.XXX这种方式获取,有时候可能涉及一些权限方面的控制,于是我把老师的例子加了一些内容,设计成一个用密码获得权限的小例子,可以帮助理解单例设计模式的用法。

  1. package Day08;
  2. //单例设计模式:可以保证一个类在内存中的对象唯一性。
  3. //就是一个类只能有一个对象,比如A、B两个程序都要访问一个配置文件,但是
  4. //由于配置文件内容太多,不合适全部作为静态类而占有太多资源,这就需要使用单例设计模式
  5. //实现方法:
  6. //1.不允许new该类对象,私有化构造函数。
  7. //2.在该类中创建本类实例并私有。
  8. //3.对外提供一个静态方法,让外界可以获取该本类对象。
  9. //(本来可以直接获取本类实例,但是通过方法来获取实例比较可控,比如方法需要密码作为参数来判断能否获取)
  10. class e02
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 Config Config副本1=Config.getInstance(900811);
  15.                 Config Config副本2=Config.getInstance(900811);
  16.                 Config副本1.setText("XXX改过的信息");
  17.                 Config副本2.setText("YYY改过的信息");
  18.                 System.out.println(Config副本1.getText());
  19.                 System.out.println(Config副本2.getText());
  20.                
  21.                
  22.                
  23.                 Config2 Config2副本1=Config2.getInstance(123356);
  24.         }
  25. }
  26. class Config //饿汉式
  27. {
  28.         private static int code=900811;
  29.         private String text="原本的信息";
  30.        
  31.         private Config(){};//私有化构造函数
  32.         private static Config s=new Config();//创建私有的本类对象
  33.         public static Config getInstance(int a)
  34.         {
  35.                 if(a==code)
  36.                 {
  37.                         System.out.println("密码正确,可以修改配置文件");
  38.                         return s;
  39.                 }
  40.                 else
  41.                 {
  42.                         System.out.println("密码错误,无法修改配置文件");
  43.                         return null;
  44.                 }
  45.         }
  46.         public void setText(String a)
  47.         {
  48.                 this.text=a;
  49.         }
  50.         public String getText()
  51.         {
  52.                 return this.text;
  53.         }
  54.        
  55. }



  56. class Config2//懒汉式 、延迟加载形式,在多线程时有可能出问题
  57. {
  58.         private static Config2 s=null;
  59.         private int code=123456;
  60.         public static Config2 getInstance(int x)
  61.         {
  62.                 if(x==123456)
  63.                 {
  64.                         if(s==null)
  65.                         s=new Config2();
  66.                         System.out.println("密码正确,可以修改配置信息");
  67.                         return s;
  68.                 }
  69.                 else
  70.                         System.out.println("密码错误,无法修改配置信息");
  71.                         return null;
  72.         }
  73.        
  74. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2