您的位置:首页 > 其它

设计模式:懒汉式和饿汉式

2017-01-23 10:36 295 查看

目录:

一、单例的简介

二、单例的优缺点

三、单例的特点

四、单例的代码

———————————————————————————————————————

一、单例的简介

下面对单例模式的懒汉式与饿汉式进行简单介绍:

1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。

2、懒汉式:当程序第一次访问单件模式实例时才进行创建。

如何选择:如果单例模式实例在系统中经常会被用到,饿汉式是一个不错的选择。反之如果单例模式在系统中会很少用到或者几乎不会用到,那么懒汉式是一个不错的选择。

二、单例的优缺点

主要优点:

1、提供了对唯一实例的受控访问。

2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

3、允许可变数目的实例。

主要缺点:

1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

三、单例的特点

1、构造方法私有

2、内部对象私有

3、提供返回对象的函数公有

四、单例的代码

饿汉式和懒汉式代码:

package Single;
public class single {

public static void main(String[] args) {

hungrySingle s1 = hungrySingle.getStudent();
hungrySingle s2 = hungrySingle.getStudent();
System.out.println(s1 == s2);

lazySingle p1 = lazySingle.getPerson(p);
lazySingle p2 = lazySingle.getPerson(p);
System.out.println(p1 == p2);
}
}

//饿汉式
class hungrySingle{
private hungrySingle(){}
private static hungrySingle s = new hungrySingle();
public static hungrySingle getStudent(){
return s;
}
}

//懒汉式
class lazySingle{
private lazySingle(){}
private static lazySingle p = null ;
public static lazySingle getPerson(lazySingle p){
if(p==null){
return new lazySingle();
}
return p;
}
}


懒汉模式在使用时,容易引起不同步问题,所以应该创建同步”锁”,代码如下

class Single1 {
private static Single1 s = null;

public Single1() {

}
//同步函数的demo
public static synchronized Single1 getInstance() {
if (s == null)
s = new Single1();

return s;
}
//同步代码快的demo加锁,安全高效
public static Single1 getInStanceBlock(){
if(s==null)
synchronized (Single1.class) {
if(s==null)
s = new Single1();
}

return s;

}
}


如果您喜欢我写的博文,读后觉得收获很大,不妨小额赞助我一下,让我有动力继续写出高质量的博文,感谢您的赞赏!!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: