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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 茄子 高级黑马   /  2014-6-9 09:41  /  3011 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 茄子 于 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;
        }
}



跪求大神解释啊

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

19 个回复

倒序浏览
构造函数私有化就是不让外部创建本类对象
回复 使用道具 举报
上面代码是单例设计模式中的懒汉式(还有一个单例设计模式是饿汉式)

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

个人浅见,希望能帮助到你。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谈到这个,必须了解类的实例化过程,即new对象的过程。
如果构造函数私有的话,下面第七步就不能执行了,所以对象也就不能创建了。
Person p = new Person("zhangsan",20);

这句话都做了什么事情?
1.因为new用到了Person.class,所以先会找到Person.class文件加载到内存中。
2.执行该类中的static代码块,如果有的话,给person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址付给栈内存中的p变量。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报 1 0
寐海流风 发表于 2014-6-9 10:28
上面代码是单例设计模式中的懒汉式(还有一个单例设计模式是饿汉式)

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

后半部分,讲的有点深奥!怀恨自己知识的浅薄!!
回复 使用道具 举报
寐海流风 发表于 2014-6-9 10:28
上面代码是单例设计模式中的懒汉式(还有一个单例设计模式是饿汉式)

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

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

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

哈哈,千里基友来相会么{:2_33:},刚看完老毕的基础部分,估计上37期有点悬了,力保39吧!
回复 使用道具 举报
☆枫の云 发表于 2014-6-9 14:48
哈哈,千里基友来相会么,刚看完老毕的基础部分,估计上37期有点悬了,力保39吧! ...

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

点评

OK,好基友一起走!  发表于 2014-6-9 17:44
回复 使用道具 举报
不让创建对象吧 不能动执行代码
回复 使用道具 举报
"单例模式",顾名思义,就是一个类有且仅有一个对象实例,为了达到这个目的,需要将类的构造函数的修饰符设置为private,这样其他类就不能调用该方法了,也就不能创建单例模式类的新对象。
回复 使用道具 举报
Rodgers 发表于 2014-6-11 02:08
"单例模式",顾名思义,就是一个类有且仅有一个对象实例,为了达到这个目的,需要将类的构造函数的修饰符设 ...

谢谢大兄弟,这问题已经解决了,不过还是谢谢你
回复 使用道具 举报
茄子 发表于 2014-6-11 09:08
谢谢大兄弟,这问题已经解决了,不过还是谢谢你

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

好基友,问题已经解决了!!!,不过还是谢谢你!!
回复 使用道具 举报
个人最简单见解,防止外部类中通过 new single()来创建实例对象,保证对象的唯一性
回复 使用道具 举报
单粒设计模式:就是通过一个类只能实现一个对象。构造函数私有化只是能满足这一条件的首先条件!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马