黑马程序员技术交流社区

标题: 求助!关于java中的单例模式 [打印本页]

作者: 世界公民    时间: 2013-6-14 08:20
标题: 求助!关于java中的单例模式
java中的单例只是为了节省内存吗?学完单例感觉非常的迷惑。在什么时候才会用到单例啊,它的优点是什么啊?先谢谢大家了。
作者: 704050a    时间: 2013-6-14 09:05
单例模式是创建模式中普遍采用的一种。使用单例模式可以确保某个类只会有一个实例被创建。
单例模式是通过下面的思想来保证的:不让类以外的任何事物创建对象的实例。通常来讲,单例可以缩减内存的需求。实现方式也有很多种。
懒汉式,饿汉式
作者: 陈新    时间: 2013-6-14 09:07
单例模式可以保证系统中一个类只有一个实例而且该实例方便外界访问
从而方便对实例个数的控制并且节约系统的资源
在系统中某个类的对象只能存在一个的时候单例模式是最好方法。
作者: 赵然    时间: 2013-6-14 10:06
优点:1.在内存中只有一个对象,节省内存空间。2.避免频繁的创建销毁对象,可以提高性能。3.避免对共享资源的多重占用。3.可以全局访问。
使用场景:1.需要频繁实例化然后销毁的对象。2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。3.有状态的工具类对象。4.频繁访问数据库或文件的对象。5.要求只有一个对象的场景。
注意项:1.只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。2.多线程使用单例使用共享资源时,注意线程安全问题。
常见模式:饿汉式和懒汉式(java中饿汉式优于懒汉式)
作者: x.love    时间: 2013-6-14 10:50
应该不节省内存,因为每次对象请求引用时都要检查是否存在类的实例,仍然需要一些开销。主要是为了保证系统中仅仅存在一个实例对象,从而节约系统资源
作者: 夜默    时间: 2013-6-14 11:19
楼主你好,问题解决了没? 解决了就去修改成 “已解决”吧!
作者: ′х.|鰉❤耔    时间: 2013-6-14 12:26
单例模式就是一种设计模式,让数据只保存一份这样就可以避免在别处实例的时候数据的错乱,这样可以保证数据只有一份可以确保数据的准确性。
用途比如你的Manager类或者Data类这个唯一的数据就需要用到单例了。
作者: 王靖远    时间: 2013-6-14 12:29
单例主要目的是为了保证实例对象的唯一。
作者: 世界公民    时间: 2013-6-14 16:57
巩建 发表于 2013-6-14 11:19
楼主你好,问题解决了没? 解决了就去修改成 “已解决”吧!

怎么才能修改帖子的状态啊,如何改成“已解决”:'(
作者: 夜默    时间: 2013-6-14 17:05
左下角有个编辑选项 就可以设置 已解决了
作者: zhouchao    时间: 2013-6-14 17:27
Java中的单例模式
当一个类的实例可以有且只可以一个的时候就需要用到了。节约内存,只是单例模式带来的一个好处。只有一个实例确实减少内存占用,可是这不是使用单例模式的理由。使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有三种形式:
第一种形式: 也是常用的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第三种形式: 双重锁的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。





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