单例设计模式
来源:互联网 发布:大掌柜进销存软件 编辑:程序博客网 时间:2024/04/27 22:27
------- <ahref="http://www.itheima.com" target="blank">android培训</a>、<ahref="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!----------
/**
单例设计模型(SingleObjectDesignPattern)
一、设计模式概述
1、起初常用在建筑领域;最佳的解决某问题的行之有效的解决方案总结成一套模式就称为设计模式;在软件开发中由“四人帮”引进并总结;
2、在Java中,总共与23种通用设计模式,可以找书《设计模式》深入了解;
3、设计模式不是偏代码,而是完全偏思想的,在长期的实践中总结出来的经验;模式的出现就是为了让问题更简单化;非常复杂的模式我们称之为框架;
4、设计模式就是解决某一类问题最行之有效的方法;单例设计模式就是一个对象被任何人使用都不会被创建新对象,永远只有一个并且不会被改变的实例对象;
二、单例设计模式
1、解决什么问题:
解决一个类在内存中只需存在一个对象的需求,即保证对象在内存中的唯一性;
这样对象的引用就可以不用通过new来创建,而是通过调用对应的访问方法获得来进行引用指向该类的对象;
2、保证对象唯一的解决方法:
(1)为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象;
(2)还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象;
(3)为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
3、用代码体现这三步;
(1)将构造函数私有化;
(2)在类中创建一个本类对象;
(3)提供一个方法可以获取到该类对象;
4、单例设计模式的使用
对于事物该怎么描述,还是怎么描述;只是当需要将该事物的对象保证在内存中唯一时,就将以上的三部加上即可;
5、两种写法:
(1)先初始化对象,即饿汉式;
开发中一般用饿汉式,因为安全简单;
private SingleObject(){}
privatestatic SingleObject s = new SingleObject();
publicstatic SingleObject getInstance()
{returns;}
(2)在方法被调用时,才初始化对象,即对象的延时加载,称为懒汉式;Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象;
private SingleObject(){}
privatestatic SingleObject s = null;//这里还没有创建对象,只是声明了一下,因为是空值;
publicstatic SingleObject getInstance()
{
if(s==null)
s=newSingleObject();
returns;
}
开发中,懒汉式会出现不安全的问题;即一个人调用没问题,但是多个人调用就会出现问题;可能会同时创建多个对象,而不保证唯一性;
cpu在几千分之一毫秒在不同程序之间切换才使得多任务同时进行;
解决方法:在方法上加如关键字 synchronized 这个关键字一加上每进一次都要加载,那么就比较低效;
但是也可以通过双重判断的形式来进行处理;不用上面的关键字;
将上面getIntance方法的方法体换一下,将读锁的次数降低;
if(s==null)
{
synchronized(Single.class)
if(s=null)
s=newSingleObject();
}
因此,在开发中,定义单例时,建议使用饿汉式;
*/
package cn.javass.c9.collectiontest;
class SingleObject
{
private SingleObject(){}
privatestatic SingleObject s = new SingleObject();
publicstatic SingleObject getInstance()
{returns;}
//以上三步就是单例设计模式的所有代码,就这三句,下面用一个示例演示下。
privateint num;
publicvoid setNum(int num){this.num=num;}
publicint getNum(){ return num;}
}
class SingleDemo
{
publicstatic void main(String[] args)
{
SingleObjectss = SingleObject.getInstance();
//因为不能创建对象,所以只能用类来调用方法,因此上面的方法要静态,也因此上面方法访问的属性也必须静态,同时成员属性也尽量私有化;
ss.setNum(56);
System.out.print(ss.getNum());
}
}