何为单例设计模式呢?
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(具体请大家自行搜索)
单例设计模式 :解决一个类在内存中只存在一个对一个对象。
如何保证对象唯一:
1.为了避免其他程序过多建立该类对象,先进制其他程序建立该类对象
2.还为了让其他程序可以访问到该类对象,只好在本类中 自定义一个 对象。
3.为了方便其他程序对自定义对象 的访问,可以对外提供一些访问方式。
这三部怎么用代码实现 呢?
1.将构造函数私有 化。
2.在该类中创建一个本类对象。
3.提供一个方法可以获取到该对象。
单例设计模式分为饿汉式和懒汉式两种模式。饿汉式:先初始化对象,类一进内存,就已经创建好了对象。懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载。
下面举例给大家具体说明一下,代码如下:
/*
这个是先初始化对象。称为:饿汉式
Single类一进内存,就已经创建好了对象。
*/
class Single
{
private int num=23;
public void setNum(int num)
{
this.num=num;
}
public int getNum()
{
return this.num;
}
private Single(){}
private static Single s=new Single();
public static Single getInstance()
{
return s;
}
}
//对象是方法被调用时,才初始化,也叫做对象的延时加载,称为 :懒汉式
//类进内存,对象还没有存在,只用调用了方法时,才建立对象
class Single2
{
private static Single2 s=null;
private Single2() {}
public static Single2 getInstance() ///synchronized
{
if (s==null)
{
s=new Single2();
}
return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Single s1=Single.getInstance();
/*
Single s2=Single.getInstance();
s1.setNum(23);
System.out.println(s2.getNum());
*/
Single2 s3=Single2.getInstance();
}
}
此例中创建了两个类Single和Single2,第一个属于饿汉式模式,第二个属于懒汉式模式,两者的区别在于:第一个类在类中就创建了对象,第二个只有在调用方法getInstance()时,才会创建相应的对象。当然这样可以解决内存,但同时也带来了隐患,因为实际会产生很多的对象实例,由于CPU在处理时,是随机处理的,可能在一个对象创建没成功时,又去执行另一个操作了,再回来创建对象时,可能又会创建一个新的对象,就不能保证对象的唯一性了。为了保证创建对象的唯一性,懒汉式的代码可以做相应的改变,如下所示:
class Single2
{
private static Single2 s=null;
private Single2() {}
public static synchronized Single2 getInstance() ///synchronized
{
if (s==null)
{
s=new Single2();
}
return s;
}
}
这样同时也带来了新的问题,那就是性能上的消耗,由于加入了synchronized,这样每次都会进行判断,带来性能上的开销。为了进一步提升效率,代码再进一步修改,如下:
class Single2
{
private static Single2 s=null;
private Single2() {}
public static Single2 getInstance() ///synchronized
{
if (s==null)
{
synchronized(Single2.class)
{
if (s==null)
s=new Single2();
}
}
return s;
}
}
这样的话既能保证对象的唯一,同时也提升了效率,但是大家可以看到与饿汉式模式相比,代码稍微长一些,同时在实际情况中的使用,我们偏重使用饿汉式模式。