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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ^.^晴天 初级黑马   /  2012-4-30 18:58  /  2713 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单例设计模式一般在什么时候用

8 个回复

正序浏览
吴超 金牌黑马 2012-5-26 20:25:09
9#
单例设计模式的思想就是,只能创建一个实体,所以需要用private这个关键字
应用主要在某一个只能创建一个对象,并且共享这个对象信息的时候
          还有一种就是和工厂模式一起用~
回复 使用道具 举报
吴琼 中级黑马 2012-5-26 14:27:34
8#
单例设计模式,在外部类中不能被创建对象。只能通过它提供的公共访问使用。每次使用的地址都是一样的。
回复 使用道具 举报
杨永峰 发表于 2012-5-25 20:43
谁错了

原来是在入学测试专区发的贴,现在已经移过来了哈
回复 使用道具 举报
本帖最后由 杨永峰 于 2012-5-25 22:58 编辑

首先,单例模式的使用是为了保证一个类在内存中最多只存在一个对象(实例)
当某个类的初始化比较耗,耗资源的时候,比如加载某些配置文件等,会选择单例模式,单例模式一般用在不需要实例化多个对象的地方 。
常用的单例模式的实现有两种,分别是懒汉式和饿汉式,饿汉式需要使用多线程同步的技术。
为了保证对象的唯一性,单例模式的实现过程中需要满足三个要求:
1>外部程序不能直接使用该类创建其对象。
2>为了使外部程序使用唯一的对象,本类自身需要在内部创建一个对象。
3>为外部程序获取对象提供公用的方法。
可能懒汉式和饿汉式的两种不用实现方式的区别更加重要
饿汉式:类被加载到内存的时候,对象随着类的初始化而创建
  1. class Single
  2. {
  3.         private static Single s = new Single(); // 直接创建静态私有的 s
  4.         private Single(){}
  5.         public static Single getInstance()
  6.         {
  7.                 return s;              //通过public 方法返回对象,保证了对象的唯一性,由于返回结果只存在一种情况,所以不涉及不同步的问题。
  8.         }
  9. }
复制代码
懒汉式:类被加载到内存,初始化,对象并未创建,直到外部程序调用获取对象的方法时,开始创建对象。
  1. class Single
  2. {
  3.         private static Single s = null; //
  4.         private Single(){}
  5.         //public static synchronized Single getInstance()  // 在这加锁的话,影响运行效率,每次调用前都需要判断。
  6.         public static Single getInstance()
  7.         {
  8.                 if(s==null)
  9.                 {
  10.                         synchronized(Single.class) // 需要考虑多线程的同步问题,虽然问题解决了,但是代码增加不少。
  11.                         {                                
  12.                                 if(s==null)
  13.                                         s = new Single();  // 满足条件,创建对象。
  14.                         }
  15.                 }
  16.                 return s;  
  17.         }
  18. }
复制代码
综合考虑程序的运行效率和有效性,实现单例模式时,建议优先考虑饿汉式。
回复 使用道具 举报
刘老师 发表于 2012-5-2 00:19
注意了!注意了!!!帖子发错模块了哦

谁错了{:3_46:}
回复 使用道具 举报
有时候我们需要内存中只有一个实例的变量,static int num = 123; 同理有时候我们也会需要只有一个实例的对象{:soso_e100:}
回复 使用道具 举报
这个问题对我来说有点太难了,翻阅了一些文档,发现这个比较容易理解一些。
(对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印机服务程序,只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A / D转换器。一个会计系统只能专用于一个公司。
我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。
一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是单例模式。)
希望能够帮到你~~

回复 使用道具 举报
注意了!注意了!!!帖子发错模块了哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马