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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林枢 黑马帝   /  2011-7-27 19:03  /  2652 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

主要用在哪方面的程序

评分

参与人数 1技术分 +1 收起 理由
admin + 1 看看大家的回答!

查看全部评分

2 个回复

倒序浏览
黑马网友  发表于 2011-7-27 19:08:33
沙发
好处就是他的名字,只允许创建该代码段的一个实例。

比如在张孝祥老师银行业务调度这个例子中,排队用的号码机只有也只能有一个,就用到了单例模式

作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点
  显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
需求大部分时候,我们把类的构造器定义成public访问权限,允许任何类自由创建这个类的实例对象,但是某些时候,允许其他类自由创建这个类的对象没有任何意义,还可能造成了系统性能的下降(因为创建一个对象的系统开销问题),例如系统可能自己hi有一个窗口管理器,一个假脱机打印设备或者一个数据库引擎访问点,这个时候如果在系统中创建多个对象就没有太大的时机意义,

如果一个类始终只能创建一个实例,则这个类就被称为单例类
这个时候我们就应该把类的构造器用private修饰,从而把这个类的所有构造器隐藏起来

根据封装型的原则:一旦把类的构造器隐藏起来,就需要提供一个public方法作为这个类的访问点,用于创建这个类的对象,且这个方法必须是static修饰(因为调用这个方法之前还不存在对象,因此调用这个方法不可能是对象,只能是类);
不仅如此,这个类还必须缓存已经创建的对象,不然这个类无法知道是不是已经创建了一个对象,也就无法只保证只创建了一个对象了,为此我们需要提供一个属性来保存曾经创建的对象,因为这个属性要被上面的静态方法访问,所以必须要用static修饰

下面我们用程序来说明这一点[code=java]package cn.itcast.heima
class Singleton
{
        //使用一个变量来缓存曾经创建的实例
        private static Singleton instance;
        //将构造器使用private修饰,隐藏该构造器
        private Singleton(){}
        //提供一个静态方法,用于返回Singleton实例
        //该方法可以加入自定义的控制,保证只产生一个Singleton对象
        public static Singleton getInstance()
        {
                //如果instance为null,表明还不曾创建Singleton对象
                //如果instance不为null,则表明已经创建了Singleton对象,将不会执行该方法
                if (instance == null)
                {
                        //创建一个Singleton对象,并将其缓存起来
                        instance = new Singleton();
                }
                return instance;
        }
}
public class TestSingleton
{
        public static void main(String[] args)
        {
                //创建Singleton对象不能通过构造器,只能通过getInstance方法
                Singleton s1 = Singleton.getInstance();
                Singleton s2 = Singleton.getInstance();
                //将输出true
                System.out.println(s1 == s2);
        }
}[/code]
[ 本帖最后由 詹季春 于 2011-07-28  00:09 编辑 ]

评分

参与人数 1技术分 +3 收起 理由
admin + 3 加分必须的!

查看全部评分

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