单例设计模式:解决一个类在内存中只存在一个对象。
想要保证对象唯一。
1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。自己建一个对象,自己能控制 ,,,定义完对象以后,得对外给人提供出去
3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
这三部怎么用代码体现呢?
1,将构造函数私有化。这个函数里面可以写东西,本类可以使用
2,在类中创建一个本类对象。
3,提供一个方法可以获取到该对象。要想返回这个对象,这个方法的返回值类型是类类型
private static Single s = new Single();
private Single(){}
public static Single getInstance() //通过这方法才能拿到这对象,不能再new对象了,用静态修饰,方法被调用只有2种方式可以用,一个是对象一个是类名,,,现在是没有对象调用那个
方法了因为其他人不能new对象了所以用类名调用,能用类名调用,这方法必须要静态,静态方法是得访问类中成员,所以Single s 也是静态,s是成员
变量,类中变量,一般定义变量都私有化所以Single s 也是私有,通过方法来访问它,只有get方法不要set方法,因为只有一个对象不需要再设置了
{
return s;
}
应用:
单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?其实无非是三个方面的作用:
第一、控制资源的使用,通过线程同步来控制资源的并发访问;
第二、控制实例产生的数量,达到节约资源的目的。
第三、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
比如,数据库连接池的设计一般采用单例模式,数据库连接是一种数据库资源,,
还有计数器的应用:
我们在浏览BBS、SNS网站的时候,常常会看到“当前在线人数”这样的一项内容。对于这样的一项功能,我们通常的做法是把当前的在线人数存放到一个内存、文件或者数据库中,每次用户登录的时候,就会马上从内存、文件或者数据库中取出,在其基础上加1后,作为当前的在线人数进行显示,然后再把它保存回内存、文件或者数据库里,这样后续登录的用户看到的就是更新后的当前在线人数;同样的道理,当用户退出后,当前在线人数进行减1的工作。所以,对于这样的一个需求,我们按照面向对象的设计思想,可以把它抽象为“在线计数器”这样一个对象,,
网站代码中凡是用到计数器的地方,只要new一个计数器对象,然后就可以获取、保存、增加或者减少在线人数的数量。不过,我们的代码实际的使用效果并不好。假如有多个用户同时登录,那么在这个时刻,通过计数器取到的在线人数是相同的,于是他们使用各自的计数器加1后存入文件或者数据库。这样操作后续登陆的用户得到的在线人数,与实际的在线人数并不一致。所以,把这个计数器设计为一个全局对象,所有人都共用同一份数据,就可以避免类似的问题,这就是我们所说的单例模式的其中的一种应用。
|