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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hsy 中级黑马   /  2014-8-27 11:53  /  2210 人查看  /  21 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文


单例模式:
        就是指类在内存中只能有一个对象
分析:怎么保证它只有一个对象呢?       
        A:外界不能够随意创建对象。
           把构造方法私有化
        B:类本身要创建一个对象。
        C:通过公共的方式提供给别人。
单例模式分类:
        饿汉式:类加载就创建对象(开发用)
        懒汉式:什么时候用,就什么时候创建。(面试用)
               
为什么有这个分类呢?
        A:懒汉式属于延迟加载。
        B:而且懒汉式线程有安全问题。怎么解决呢?两个字:加锁!!!


开发用的单例设计模式之饿汉式(以Student为例)
public class Student {
        // 构造方法私有化
        private Student() {
        }
        // 类本身要有一个对象,由于静态只能访问静态,所以这里加静态;
        //为了不让外界通过类名直接访问s成员变量,就加私有

        private static Student s = new Student();

        // 对外提供公共方式,为了不让外界通过类名访问就加静态
        public static Student getStudent() {
                return s;
        }
        //这个方法可写可不写
        public void show() {
                System.out.println("hello");
        }
  }


}
public class StudentTest {
        public static void main(String[] args) {

       Student s1 = Student.getStudent();

       Student s2 = Student.getStudent();
        s1.show();
        s2.show();// 结果是一样的,s1和s2是同一个对象

        }

}

面试用的单例设计模式之懒汉式(以Teacher为例)

public class Teacher {
       
        // 构造方法私有化
        private Teacher() {

        }
       
        // 类本身要有一个对象,但现在不创建
        private static Teacher t = null;
       
        // 对外提供公共方式,并创建对象,方法加锁解决线程安全问题

        public synchronized static Teacher getTeacher() {
               
                if (t == null) {
                       
                   t = new Teacher();
                }
                return t;
        }

        public void show() {
                System.out.println("world");
        }
}


public class TeacherTest {
        public static void main(String[] args) {

        Teacher t1 = Teacher.getTeacher();

        Teacher t2 = Teacher.getTeacher()

                t1.show();
                t2.show();//结果是一样的,t1和t2是同一个对象
        }
}

21 个回复

倒序浏览
写的好,很清楚。
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
楼主写的很详细,赞个!
回复 使用道具 举报
课外辅导书一样的存在,O(∩_∩)O谢谢!
回复 使用道具 举报
孙雯 发表于 2014-8-27 22:00
课外辅导书一样的存在,O(∩_∩)O谢谢!

那我就“呵呵”啦
回复 使用道具 举报
gmz158 中级黑马 2014-8-27 22:27:01
7#
多谢分享      
回复 使用道具 举报
七弟 中级黑马 2014-8-27 23:25:34
8#
学习一下
回复 使用道具 举报
付剑翊 来自手机 中级黑马 2014-8-27 23:43:32
9#
这样也可以拿技术分么
回复 使用道具 举报
hsy 中级黑马 2014-8-28 08:17:45
10#

不谢,资源共享
回复 使用道具 举报
hsy 中级黑马 2014-8-28 08:18:47
11#

好的,有明白的可以回复给我
回复 使用道具 举报
hsy 中级黑马 2014-8-28 08:19:49
12#
付剑翊 发表于 2014-8-27 23:43
这样也可以拿技术分么

你以为呢?
回复 使用道具 举报
hsy 中级黑马 2014-8-28 08:21:22
13#
天邃任我桓 发表于 2014-8-27 21:27
楼主写的很详细,赞个!

多谢支持!
回复 使用道具 举报
hsy 中级黑马 2014-8-28 08:22:30
14#
回复 使用道具 举报
hsy 中级黑马 2014-8-28 08:23:38
15#
li495512592 发表于 2014-8-27 17:00
写的好,很清楚。

是吗?谢谢哦
回复 使用道具 举报
还可以直接得技术分啊,我还以为只能用黑马币换呢
回复 使用道具 举报
hsy 中级黑马 2014-8-28 09:38:51
17#
xiayoutianxia 发表于 2014-8-28 09:00
还可以直接得技术分啊,我还以为只能用黑马币换呢

做题,做活动可以直接得技术分
回复 使用道具 举报
hsy 发表于 2014-8-28 09:38
做题,做活动可以直接得技术分

你的这个帖子是做题?
回复 使用道具 举报
hsy 中级黑马 2014-8-28 13:47:21
19#
xiayoutianxia 发表于 2014-8-28 09:56
你的这个帖子是做题?

不是,只是和大家分享一下,你可以去做活动,活动会让你做题,做好后按要求提交,做的好就会直接送技术分
回复 使用道具 举报
也可以用枚举实现一个单例哦。
当枚举只有一个成员时,就可以作为一种单例的实现方式。
  1. package com.itheima;

  2. public class SingletonDemo {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 Singleton ss = Singleton.single;
  8.                 Singleton ss1 = Singleton.single;
  9.                 System.out.println(ss == ss1);
  10.         }
  11.        
  12.         public enum Singleton{
  13.                 single
  14.         }

  15. }
复制代码



回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马