设计模式:懒汉式和饿汉式
原创
©著作权归作者所有:来自51CTO博客作者北京小辉的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录:
一、单例的简介
二、单例的优缺点
三、单例的特点
四、单例的代码
一、单例的简介
下面对单例模式的懒汉式与饿汉式进行简单介绍:
**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);
Singleton p1 = Singleton.getPerson();
Singleton p2 = Singleton.getPerson();
System.out.println(p1 == p2);
}
}
//饿汉式
class hungrySingle{
private hungrySingle(){}
private static hungrySingle s = new hungrySingle();
public static hungrySingle getStudent(){
return s;
}
}
//懒汉式
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉模式在使用时,容易引起不同步问题,所以应该创建同步"锁",代码如下
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;
}
}