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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangxin540 中级黑马   /  2013-8-16 00:42  /  1787 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangxin540 于 2013-8-16 22:28 编辑

毕老师的视频中没有单利设计模式一,一上来就直接是二,我这个就挂那了:不明白原理,重点也不明白它为什么存在,或者说单利设计模式的意义是什么?

6 个回复

倒序浏览
单例模式:解决对象的唯一性,保证了内存中一个对象是唯一的(因为频繁的创建对象,回收对象会造成系统性能下降)
应用:比如我们在浏览BBS、SNS网站的时候,常常会看到“当前在线人数”这样的一项内容。对于这样的一项功能,我们通常的做法是把当前的在线人数存放到一个内存、文件或者数据库中,每次用户登录的时候,就会马上从内存、文件或者数据库中取出,在其基础上加1后,作为当前的在线人数进行显示,然后再把它保存回内存、文件或者数据库里,这样后续登录的用户看到的就是更新后的当前在线人数;同样的道理,当用户退出后,当前在线人数进行减1的工作。所以,对于这样的一个需求,我们按照面向对象的设计思想,可以把它抽象为“在线计数器”这样一个对象,而且它只能有一个对象存在,即可以用单例模式,具体实现如下:
Java代码:
//在线人数计数器
class OnlineCounter {
    //在线人数
    private int onlineCount = 0;
    //构造函数
    public OnlineCounter(){
       //从文件或者数据库读取数据,假如读出来的数据是100
       this.onlineCount = 100;
    }
    //在用户登录后,在线人数加1
    public void incCount(){
       this.onlineCount++;
    }
    //在用户退出后,在线人数减1
    public void decCount(){
       this.onlineCount--;
    }
    //保存在线人数
    public void saveCount(){
  }  
    //获取在线人数
    public int getCount(){
       return onlineCount;
    }
    //测试函数
    public static void main(String[] args) {
       try{
       OnlineCounter onlineCounter = new OnlineCounter();
       System.out.println("在线人数:" +onlineCounter.getCount());
       onlineCounter.incCount();
       System.out.println("在线人数:" + onlineCounter.getCount());
       onlineCounter.decCount();
       System.out.println("在线人数:" + onlineCounter.getCount());
       }catch(Exception err){
       }
    }
}

点评

+1  发表于 2013-8-16 05:52

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
单例模式的实现类只允许有一个类的实例并且提供了个全局指针来引用该例子

为什么想要保证对象唯一?
1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象。
2,还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象。
3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

怎么用代码保证对象唯一呢?
1,将构造函数私有化。
2,在类中创建一个本类对象。(私有的静态的)
3,提供一个方法可以获取到该对象。
实际开发中对于事物该怎么描述,还怎么描述。当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。

懒汉式和饿汉式的代码我就不打了,视频都有的


回复 使用道具 举报
作用:解决一个类在内存中只存在一个对象的问题。像后期讲多线程的时候,多个方法操作的是同一个对象,需要保证对象的唯一,这时就可以用单例设计模式。
如何保证对象唯一:
1)        为了避免其他程序过多建立该类对象,先禁止其他程序建立该对象.//将构造函数私有化
2)        为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象.//在类中创建一个本类对象
3)        为了方便其他程序对自定义对象的访问,可对外提供一些访问方式.//提供一个方法可以
回复 使用道具 举报
静以修身 发表于 2013-8-16 01:04
单例模式:解决对象的唯一性,保证了内存中一个对象是唯一的(因为频繁的创建对象,回收对象会造成系统性能 ...

但是单利设计模式不是应该把构造函数私有化么?然后在类中创建对象,并封装方法向外提供。一这样的方式达到只能建立一个对象的目的呀!!

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
yangxin540 发表于 2013-8-16 18:17
但是单利设计模式不是应该把构造函数私有化么?然后在类中创建对象,并封装方法向外提供。一这样的方式达 ...

哦,写错了。创建单例是你说的那样,有三步:1,私有化构造函数;2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。

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