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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 欧阳才志 黑马帝   /  2012-4-11 16:50  /  3703 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
功能:演示单例开发模式
时间:2012.4.11
*/
class  single
{
        private static single s new single();
        private single() {}
        public static single getinstance()
        {
                return s;
        }
       
}
//饿汉式
//class  single1
//{
//        private static single1 s=null;
//        private single1() {}
//        public static single1 getinstance()
//        {
//                if(s==null)
//                        s=new single();
//                return s;
//        }
//}
//懒汉式
//原则  定义单例时原则上用饿汉式
class singledemo
{
        public static void main(String [] args)
        {
                System.out.println("Hello world");
        }
}
看了一节单例的课程,但是还是不知道这个东西是做啥用的。只知道保证了对象实例的唯一性。怎么感觉好像应用不多一样啊。求高手指点!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

12 个回复

正序浏览
单例就是限制只能创建类的一个对象,就是只有一个实例。
实用价值:
从单例模式的字面上的意思来理解它的用途, 是对系统资源的节省, 可以避免重复实例化。但比较实用的作用是:
1.使用单例模式, 则可以避免大量的new 操作消耗的资源。
如web开发应用主要应用于数据库应用, 所以一个应用中会存在大量的数据库操作,
在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。
2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现.

小心bug:
单例模式必须考虑并行情况下的操作,不可重入的方法和必须独占使用的数据要记得加锁!
例如,如果打印机类是使用单例模式设计的,那打印的操作必须加锁,
某台电脑正在打印文档的时候别的机器就不能使用打印功能,否则可以想象的情况是我打印一点内容后被别人抢去打印了

别人的一点内容,然后我又抢到了。。。
这样打印出来的东西就没用了。

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2 赞一个!

查看全部评分

回复 使用道具 举报
创建一个类的实例是要在内存中开辟空间的,有的类只需要创建一次用单例模式来设计就可以大大减少对内存空间的占用!也可以提高代码的健壮性
回复 使用道具 举报
Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

      在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

      还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供

服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能

synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下

方便的做到。

      另外方面,Singleton也能够被无状态化。提供工具性质的功能,

      Java Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存

,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2 赞一个!

查看全部评分

回复 使用道具 举报
单例设计模式,举个简单的例子,3台电脑一个打印机一次只能进去一个电脑操作,如果进入两个将会出现打印错乱,这就是单例的思想。
回复 使用道具 举报
高铭 中级黑马 2012-4-12 18:32:37
9#
单例模式最大的用处就是保证该类只被创建一次,其他的类都不能在去该类进行创建。饿汉式和懒汉式的区别就是,当别人需要这个类的时候,如果是饿汉式就能直接返回唯一的该对象,懒汉式则需要调用的时候去判断该对象是不是为空,如果为空就创建,如果不是就直接调用已存在的对象。其实单例模式中变量,创建的对象(针对饿汉式)和静态代码块,都使用了static关键字,而static关键字的作用就是让内存只加载一次,且不会被销毁(在虚拟机不重新启动的情况下),这也就解释了单例的唯一性,因为内存中始终都存在改对象,如果再次去创建该对象,用New 关键字去开辟内存的时候,首先会去找内存中有没有该对象,如果有则不去开辟内存空间,如果没有,则开辟空间。
我说了以上这些,你可能会发现,上面的同学说的有利于内存管理,这种说法是错误的,在实际的开发过程中,static修饰的方法和变量甚至单例模式使用的时候一定要慎重,特别是搞j2ee的同学,因为一个网站的服务器不会经常重启的,访问量又很大,所以,每个用户进网站后如果都要给他们创建静态的方法或者变量,这些静态的都要长住内存的,对服务器的内存是致命性的打击,所以,静态变量或者方法,或者单例模式使用要慎重。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
单例模式是当你的系统里只有一个这个东西的时候用的。单例创建后,只能调用他。而无法再创建第二次
比如,数据库的链接,只能有一个,多个反而会出错,所以,就要使用单件模式,强制的让他只有一个实例。
单例模式,还可以延迟构造,只有当第一次使用这个实例的时候,构造一次。
回复 使用道具 举报
昨天我还在纠结:当初学类的时候,就是为了把类抽象出来,然后定义更多此类对象,现在突然来个单例模式,将我好不容易抽象出来的类,变成只能定义一个对象,岂不是违背了我的初衷了?
不过我现在清楚了:就是因为我们的类可以定义很多对象,为了更严谨,让它能够满足某些情况下该类只定义一个对象的情况,所以才有了单例模式,
两者并不冲突。
哈哈!谢谢大家了哈!问题已解决!
回复 使用道具 举报
单例模式主要作用是保证程序中一个类Class只有一个实例存在,还可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收
回复 使用道具 举报
单例模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用单例的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收
回复 使用道具 举报
        单例模式是创建模式中普遍采用的一种。使用单例模式可以确保某个类只会有一个实例被创建。单例模式是通过下面的思想来保证的:不让类以外的任何事物创建对象的实例。通常来讲,单例可以缩减内存的需求。现在大家很多都没有实际开发经验,我这里也一时举不出合适的例子,先记住这种模式的特点啦。
     前人们总结的23中经典设计模式之一,相信不会没有用吧?!
回复 使用道具 举报
1、单例模式能够保证一个类仅有唯一的实例,并提供一个全局访问点。
2、单例模式主要有3个特点:
(1)、单例类确保自己只有一个实例。
(2)、单例类必须自己创建自己的实例。
(3)、单例类必须为其他对象提供唯一的实例。
3、对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。
4、对于饿汉模式,我们可以这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
1,。为了避免其他程序多建立该类对象。先禁止其他程序建立该类对象
2。还未了让其他程序反问改类对象。只好在本类中。自定义一个对象
3。为了方便其他程序对自定义对象的访问。可以对外提供一些访问方式

为了避免其他程序多建立该类对象。先禁止其他程序建立该类对象。
如果对象中构造函数可以传入参数。建立对象。就会改变对象初始化数据。而该对象只提供功能。避免其他调用着创建对象,而改动初始数据。所以封装对象


评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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