黑马程序员技术交流社区

标题: 多线程中的单例设计模式 [打印本页]

作者: 茄子    时间: 2014-6-9 09:41
标题: 多线程中的单例设计模式
本帖最后由 茄子 于 2014-6-9 16:04 编辑

马儿们,今天看到单例设计模式,突然有了一点疑问::

就是单例设计模式中,构造函数私有化的用法和作用???突然感觉很迷茫,这是为什么呢》???

下面是代码:

class Single
{
        private static Single s=null;
        private Single(){}     ……………………………………………………………………构造函数私有化的用法和作用:??
        public static  Single getInstance()
        {
                if(s==null)         //利用两次判断,减少判断锁的次数,提高程序的效率!
                {
                        synchronized(Single.class)     //注意,这里的锁是该类的字节码文件对象。
                        {
                                if(s==null)
                                {
                                        s=new Single();
                                }
                                
                        }
                }
                return s;
        }
}



跪求大神解释啊

作者: 松涛小玮    时间: 2014-6-9 09:44
构造函数私有化就是不让外部创建本类对象
作者: 寐海流风    时间: 2014-6-9 10:28
上面代码是单例设计模式中的懒汉式(还有一个单例设计模式是饿汉式)

单例设计模式的初衷就是:避免其他对象实例化自己的对象;所以将自己的构造函数私有化(private只有本类有访问权限),这样就阻止了其他程序可以随意new自己的对象;并且在本类中提供一个public static方法(如上面的public static  Single getInstance(){}方法),在方法中new一个对象。——这样就既保证了该类对象的唯一性(外界只能通过该public static方法访问该类实例),又保证了该类对象的封装性和安全性。
而单例设计模式的用法:可以参考下java.lang包下的一个类Runtime;这个Runtime类就是采用了饿汉式单例设计模式,而且可以简单的这么理解这个类中的这种设计:Runtime 类的大多数方法是实例方法,并且必须根据当前的运行时对象对其进行调用;假如我们手动new一个Runtime时,不管怎么操作这个对象,都要先通过getRuntime来先获取JVM当前运行时对象,才能对其进行其他操作;那么我们不如把这个对象获取方式封装到getRuntime方法中,这样就实现了单例设计模式的初衷:对外只暴漏一个实例对象,提供一个方法自动生成这个对象,通过这个public static方法向外提供访问该实例的途径。

个人浅见,希望能帮助到你。
作者: ☆枫の云    时间: 2014-6-9 10:34
谈到这个,必须了解类的实例化过程,即new对象的过程。
如果构造函数私有的话,下面第七步就不能执行了,所以对象也就不能创建了。
Person p = new Person("zhangsan",20);

这句话都做了什么事情?
1.因为new用到了Person.class,所以先会找到Person.class文件加载到内存中。
2.执行该类中的static代码块,如果有的话,给person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址付给栈内存中的p变量。
作者: 茄子    时间: 2014-6-9 12:28
寐海流风 发表于 2014-6-9 10:28
上面代码是单例设计模式中的懒汉式(还有一个单例设计模式是饿汉式)

单例设计模式的初衷就是:避免其他对 ...

后半部分,讲的有点深奥!怀恨自己知识的浅薄!!
作者: 茄子    时间: 2014-6-9 12:30
寐海流风 发表于 2014-6-9 10:28
上面代码是单例设计模式中的懒汉式(还有一个单例设计模式是饿汉式)

单例设计模式的初衷就是:避免其他对 ...

前半部分讲的很好,听懂了;后半部分讲的有点深奥,可能是自己对runtime的不了解吧!!怀恨自己知识的浅薄!!
作者: 茄子    时间: 2014-6-9 12:31
☆枫の云 发表于 2014-6-9 10:34
谈到这个,必须了解类的实例化过程,即new对象的过程。
如果构造函数私有的话,下面第七步就不能执行了,所 ...

感觉咱们这么有缘啊!!!兄弟准备多少期呢??
作者: kongyan4696    时间: 2014-6-9 14:12
都说是单例了,  只能使用类给的对象。
作者: woshihq    时间: 2014-6-9 14:29
你不写构造方法的话,默认是public的,但你写了private之后,外部就不能够new出一个对象了,这就限制外部可以new出多个对象来
作者: ☆枫の云    时间: 2014-6-9 14:48
茄子 发表于 2014-6-9 12:31
感觉咱们这么有缘啊!!!兄弟准备多少期呢??

哈哈,千里基友来相会么{:2_33:},刚看完老毕的基础部分,估计上37期有点悬了,力保39吧!
作者: 茄子    时间: 2014-6-9 16:04
☆枫の云 发表于 2014-6-9 14:48
哈哈,千里基友来相会么,刚看完老毕的基础部分,估计上37期有点悬了,力保39吧! ...

好好好,那么我们就39了,听你的

作者: crazylong    时间: 2014-6-9 17:29
不让创建对象吧 不能动执行代码
作者: Rodgers    时间: 2014-6-11 02:08
"单例模式",顾名思义,就是一个类有且仅有一个对象实例,为了达到这个目的,需要将类的构造函数的修饰符设置为private,这样其他类就不能调用该方法了,也就不能创建单例模式类的新对象。
作者: 茄子    时间: 2014-6-11 09:08
Rodgers 发表于 2014-6-11 02:08
"单例模式",顾名思义,就是一个类有且仅有一个对象实例,为了达到这个目的,需要将类的构造函数的修饰符设 ...

谢谢大兄弟,这问题已经解决了,不过还是谢谢你
作者: Rodgers    时间: 2014-6-11 09:59
茄子 发表于 2014-6-11 09:08
谢谢大兄弟,这问题已经解决了,不过还是谢谢你

呵呵,不用谢,相互学习啊
作者: 姿_`态    时间: 2014-6-11 11:30
什么是单例设计模式,就是只允许创建一个对象,把构造函数私有了,就没办法创建对象了,为了让其他程序访问到该类对象,只好在本类中自定义一个对象,并提供访问方式
作者: 茄子    时间: 2014-6-11 13:57
姿_`态 发表于 2014-6-11 11:30
什么是单例设计模式,就是只允许创建一个对象,把构造函数私有了,就没办法创建对象了,为了让其他程序访问 ...

好基友,问题已经解决了!!!,不过还是谢谢你!!
作者: 张志民    时间: 2014-6-11 14:11
个人最简单见解,防止外部类中通过 new single()来创建实例对象,保证对象的唯一性
作者: sun_jun    时间: 2014-6-11 21:14
单粒设计模式:就是通过一个类只能实现一个对象。构造函数私有化只是能满足这一条件的首先条件!




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