黑马程序员技术交流社区

标题: 单例设计模式的相关知识 [打印本页]

作者: hsy    时间: 2014-8-27 11:53
标题: 单例设计模式的相关知识

单例模式:
        就是指类在内存中只能有一个对象
分析:怎么保证它只有一个对象呢?       
        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是同一个对象
        }
}


作者: li495512592    时间: 2014-8-27 17:00
写的好,很清楚。
作者: 这个夏天的芬芳    时间: 2014-8-27 20:06
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: 天邃任我桓    时间: 2014-8-27 21:27
楼主写的很详细,赞个!
作者: 孙雯    时间: 2014-8-27 22:00
课外辅导书一样的存在,O(∩_∩)O谢谢!
作者: hsy    时间: 2014-8-27 22:19
孙雯 发表于 2014-8-27 22:00
课外辅导书一样的存在,O(∩_∩)O谢谢!

那我就“呵呵”啦
作者: gmz158    时间: 2014-8-27 22:27
多谢分享      
作者: 七弟    时间: 2014-8-27 23:25
学习一下
作者: 付剑翊    时间: 2014-8-27 23:43
这样也可以拿技术分么
作者: hsy    时间: 2014-8-28 08:17
gmz158 发表于 2014-8-27 22:27
多谢分享

不谢,资源共享
作者: hsy    时间: 2014-8-28 08:18
七弟 发表于 2014-8-27 23:25
学习一下

好的,有明白的可以回复给我
作者: hsy    时间: 2014-8-28 08:19
付剑翊 发表于 2014-8-27 23:43
这样也可以拿技术分么

你以为呢?
作者: hsy    时间: 2014-8-28 08:21
天邃任我桓 发表于 2014-8-27 21:27
楼主写的很详细,赞个!

多谢支持!
作者: hsy    时间: 2014-8-28 08:22
这个夏天的芬芳 发表于 2014-8-27 20:06

{:2_30:}{:2_31:}
作者: hsy    时间: 2014-8-28 08:23
li495512592 发表于 2014-8-27 17:00
写的好,很清楚。

是吗?谢谢哦
作者: xiayoutianxia    时间: 2014-8-28 09:00
还可以直接得技术分啊,我还以为只能用黑马币换呢
作者: hsy    时间: 2014-8-28 09:38
xiayoutianxia 发表于 2014-8-28 09:00
还可以直接得技术分啊,我还以为只能用黑马币换呢

做题,做活动可以直接得技术分
作者: xiayoutianxia    时间: 2014-8-28 09:56
hsy 发表于 2014-8-28 09:38
做题,做活动可以直接得技术分

你的这个帖子是做题?
作者: hsy    时间: 2014-8-28 13:47
xiayoutianxia 发表于 2014-8-28 09:56
你的这个帖子是做题?

不是,只是和大家分享一下,你可以去做活动,活动会让你做题,做好后按要求提交,做的好就会直接送技术分
作者: 魏诚东    时间: 2014-8-30 14:15
也可以用枚举实现一个单例哦。
当枚举只有一个成员时,就可以作为一种单例的实现方式。
  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. }
复制代码




作者: hsy    时间: 2014-8-30 14:19
魏诚东 发表于 2014-8-30 14:15
也可以用枚举实现一个单例哦。
当枚举只有一个成员时,就可以作为一种单例的实现方式。

枚举我只知道一点皮毛,这次又涨见识了,呵呵呵
作者: 魏诚东    时间: 2014-8-30 14:28
hsy 发表于 2014-8-30 14:19
枚举我只知道一点皮毛,这次又涨见识了,呵呵呵

都差不多啦,这是后面高新技术里讲枚举简单提到的一点。




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