java设计模式之单例模式

来源:互联网 发布:excle怎么做数据分析 编辑:程序博客网 时间:2024/04/30 09:25

这是我的第一篇博客,学习java 1年了,以前学习都是出于那种似懂非懂的状态,学java过程中,很少想过去弄懂它运行的原理,代码设计思路之类的,现在大四了,最近都在为了找工作而奔波,一次次的参加面试,一次次的被刷,很多时候HR问的问题都感觉是以前见过或者学过的,可是在面试时却一时想不起来了,今天想了很久,我觉得是以前学习时没有总结和思考,学过之后就抛在一边了,平时也不怎么写代码来巩固,然后随着时间的流逝,学过的知识也随之而忘记了,所以,我觉得有必要写写博客,来加深自己对java的学习,同时也希望自己有空经常逛论坛、博客等向大牛学习讨教,提升自己的实力。

今天要写的是关于单利设计模式的一些心得和想法,首先,什么事设计模式呢?

首先,设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的(按照一定的标准和规则

对某范围内文献资源信息每种实体(Item)的外部特征和内容特征进行分析、选择、描述,并予以记录成为款目,继而将款目按一定顺序组织成为目录(Catalogue)或书目(Bibliography)的过程)、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(本段摘自百度百科)

其次,什么是单例设计模式呢?顾名思义,单例就是单实例,即一个类在内存中只有一个实例,有时候,我们需要在使用一个类时只能有一个实例化对象,那么此时就要用到单利设计模式了。

单例模式有如下一些特点:

1、构造函数是私有的(保证其他类不能创建本类对象)

2、在本类中创建一个类对象(此对象可以调用本类中的方法)

3、给外界提供一个public方法用于获取该对象

单例模式一般分为懒汉式和饿汉式两种:(如下为代码体现和注解)

1,饿汉式:

class SingleTon{    

private static SingleTon single = new SingleTon();//创建本类对象 此处single是静态的,因为其要被静态方法getInstance()方法调用

private SingleTon(){}//构造函数私有化    

public static SingleTon getInstance(){   //外界通过此方法获得本类对象  调用方法的方式有两种,1是通过实例化对象,2是通过类名调用,很明显此处需要被类名调//用,那么此时方法必须是静态的。   

return single;  

}

}

 

2,懒汉式:

class SingleTon{

private static SingleTon single = null;

 private SingleTon(){}

 public static SingleTon single(){   

 if(single == null){ 

single = new SingleTon();   

 } 

}

 }

注意:当在学过多线程之后就会很明显的发现当多线程同时访问懒汉式时会出现安全问题,此时可以这样解决:

class SingleTon{

 private static SingleTon single = null; 

private SingleTon(){}

 public static synchronized SingleTon getInstance(){

 if(single == null){

 single = new SingleTon();

 } 

return single;

 } 

}

上面代码解决了线程安全问题,但是会影响代码的运行速度,因为判断锁会消耗资源,所以可以作如下优化:

class SingleTon{

 private static SingleTon single = null;

 private SingleTon(){}

 public static SingleTon getInstance(){

 if(single == null){

 synchronized(SingleTon.class){   //SingleTon.class获得本类锁对象

 if(single == null)

 single = new SingleTon();

 }

}

return single;

}

 }

上面代码通过两次判断可以稍微提高效率,因为在single不为空是,第一个if语句为假,不会在继续判断的锁。

 

 

总结:

1,单例模式的出现解决了实例唯一的问题

2,饿汉式和懒汉式的区别:

饿汉式的对象在类对象加载的时候就随之而创建,而懒汉式要等到调用getInstance()方法时才创建(可以称之为延迟加载),所以在性能上,饿汉式要稍好些;

同时,饿汉式在使用时不必考虑线程安全问题,所以在用单例模式时,建议首选饿汉式。

 

 

1 0
原创粉丝点击