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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张学东 中级黑马   /  2012-10-17 19:34  /  1159 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

何为单例设计模式?
一个类中只提供一个实例对象让外面访问。

单例设计模式分为三种实现方法:
1.饿汉式:
  1. package com.itheima.zxd;
  2. //饿汉式单例类.在类初始化时,已经自行实例化
  3. public class Singleton1 {
  4. //私有的默认构造子函数,这个类不能在外面实例化
  5. private Singleton1() {

  6. }
  7. //已经自行实例化
  8. private static final Singleton1 single = new Singleton1();
  9. //静态工厂方法
  10. public static Singleton1 getInstance() {
  11. return single;
  12. }
  13. }
复制代码
2.懒汉式:
  1. package com.itheima.zxd;
  2. //懒汉式单例类.在第一次调用的时候实例化
  3. public class Singleton2 {
  4. //私有的默认构造子
  5. private Singleton2() {
  6. }
  7. //注意,这里没有final
  8. private static Singleton2 single;
  9. //只实例化一次 (当你使用我的时候我才实例化)
  10. static{
  11. single = new Singleton2();
  12. }
  13. //静态工厂方法
  14. public synchronized static Singleton2 getInstance() {
  15. if (single == null) {
  16. single = new Singleton2();
  17. }
  18. return single;
  19. }
  20. }
复制代码
饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
3.登记式:
  1. package com.itheima.zxd;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. //登记式单例类.
  5. //类似Spring里面的方法,将类名注册,下次从里面直接获取。
  6. public class Singleton3 {
  7. private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
  8. static{
  9. Singleton3 single = new Singleton3();
  10. map.put(single.getClass().getName(), single);
  11. }
  12. //保护的默认构造子
  13. protected Singleton3(){}
  14. //静态工厂方法,返还此类惟一的实例
  15. public static Singleton3 getInstance(String name) {
  16. if(name == null) {
  17. name = Singleton3.class.getName();
  18. System.out.println("name == null"+"--->name="+name);
  19. }
  20. if(map.get(name) == null) {
  21. try {
  22. map.put(name, (Singleton3) Class.forName(name).newInstance());
  23. } catch (InstantiationException e) {
  24. e.printStackTrace();
  25. } catch (IllegalAccessException e) {
  26. e.printStackTrace();
  27. } catch (ClassNotFoundException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. return map.get(name);
  32. }
  33. //一个示意性的商业方法
  34. public String about() {
  35. return "Hello, I am RegSingleton.";
  36. }
  37. public static void main(String[] args) {
  38. Singleton3 single3 = Singleton3.getInstance(null);
  39. System.out.println(single3.about());
  40. }
  41. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

1 个回复

倒序浏览
谢谢版主的技术分了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马