A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文盲庄稼汉 中级黑马   /  2014-8-30 11:36  /  809 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单例设计模式:解决一个类在内存只存在一个对象。
想要保证对象唯一,怎么办?
1、为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。
2、还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象。
3、为了让其他程序对自定义的访问,可以对外提供一些访问方式。
这三步怎么使用代码体现呢?
1、创建私有静态构造函数(用private修饰)。
      private修饰:一般类变量应该私有化,只能通过成员方法来访问。
2、创建私有静态对象(用private和statis修饰)。
      statis修饰:静态方法访问类中的成员,成员也必须是静态的。
      private修饰:禁止其他类创建本类对象。
3、创建共有静态方法获取私有对象(用public和statis修饰)。
      public修饰:公开一个获取该类对象的方法。
      static修饰: 调用方法可通过类名调用和对象调用,但没有对象,只能通过类名,所以该方法必须是静态的。
      不设置set方法,是因为该类只有一个对象,不需要设置。
  1. class Single{
  2.         private Single(){}
  3.         private static Single s = new Single();
  4.         public static Single getInstance(){
  5.         return s;
  6.         }
  7. }

  8. class SingleDemo{
  9.         public static void main(String[] args){
  10.         Single ss = Single.getInstance();
  11.         }
  12. }
复制代码

那么单例设计怎么使用?
对于事物该怎么描述,就怎么描述。
当需要该事物的对象保证在内存中唯一时,就将以上的三步加上即可。

这种方式也称为饿汉式
  1. class Single{
  2.    
  3.     //私有成员变量
  4.     private int num;

  5.     //对外公开设置方法
  6.     public void setNum(int num){
  7.         this.num = num;
  8.     }
  9.     //对外公开获取方法
  10.     public int getNum(){
  11.         return num;
  12.     }

  13.     //私有构造函数,阻止本类以外的类使用
  14. private Single(){}  

  15.     //创建本类对象
  16.     //被静态方法访问,就要被 static 修饰
  17.     //s是成员变量,要用 private 修饰
  18. private static Single s = new Single();

  19.     //提供共有方法访问本类私有静态对象
  20.     //返回值为类类型
  21. public static Single getInstance(){
  22.         //访问本类对象,静态方法只能访问静态对象
  23. return s;
  24. }
  25. }

  26. class SingleDemo{
  27. public static void main(String[] arge){
  28.         Single s1 = Single.getInstance();
  29.         Single s2 = Single.getInstance();
  30.         //s1和s2都是同一个对象
  31.         System.out.println(s1==s2);
  32.         
  33.         //设置s1的值,s2的值也跟着改变,因为他们都是同一对象。
  34.         s1.setNum(25);
  35. System.out.println(s1.getNum());//25
  36.         System.out.println(s2.getNum());//25
  37.     }
  38. }
复制代码








0 个回复

您需要登录后才可以回帖 登录 | 加入黑马