您的位置:首页 > 职场人生

黑马程序员-JAVA基础之单例设计模式

2015-08-20 22:25 471 查看
————– android培训、java培训、java学习型技术博客、期待与您交流! ———–

设计模式就是解决某一类问题最行之有效的方法,java中23种设计模式:

设计模式的设计原则无非有以下几点:

1. 逻辑代码独立到单独的方法中,注重封装性-易读,易复用。

不要在一个方法中,写下上百行的逻辑代码。把各小逻辑代码独立出来,写于其他方法中,易读其可重复调用。

2. 写类,写方法,写功能时,应考虑其移植性,复用性:防止一次性代码。是否可以拿到其他同类事物中应用?是否可以拿到其他系统中应用?

3. 熟练运用继承的思想:找出应用中相同之处,且不容易发生变化的东西,把他们抽取到抽象类中,让子类去继承他们。

4. 熟练运用接口的思想:

找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起

何为单例设计模式?

单例设计模式就是解决一个类在内存中只有一个对象

多个程序使用统一配置信息对象时,需要保证该对对象的唯一性。

保证对象唯一性的实现步骤:

1.将构造函数私有化:为了避免其他程序过多建立该对象,禁止其他程序调用该对象。

2.在类中创建一个本类对象:为了让其他程序可以访问该类对象

3.提供一个方法可以获取到该对象的方法:方便其他程序访问自定义的本类对象。

代码体现:

1,将构造函数私有化。

2,在类中创建一个本类对象。

3,提供一个方法可以获取到该对象。

单例设计模式的优缺点

优点:

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

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

缺点:

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

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

记住原则:定义单例,建议使用饿汉式,原因就是饿汉式简单安全。

饿汉式:是先初始化对象,一进内存 就创建了对象

class single{
private single(){}//将构造函数私有化
private static single s=new single();//在类中创建一个本类对象
public static single getInstance(){//提供一个方法可以获取到该对象的方法
return s;
}
}
public class SingleDemo {
public static void main(String[] args) {
single ss=single.getInstance();
}
}


懒汉式:什么时候调用什么时候创建对象,对象的延时加载

//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
class Single
{
private static Single s = null;
private Single(){}//将构造函数私有化
public static Single getInstance()//提供一个方法可以建立对象并获取对象。
{
if(s==null)
s=new Single();
return s;
}
}


懒汉式的延时加载有没有问题?

有,如果多线程访问时,会出现安全问题。

可以加同步来解决,使用synchronized可以解决出现的问题,但是当使用了synchronized后必然导致程序运行效率的地下,所以记录原则:定义单例设计模式,建议使用饿汉式。

//改进后
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();
}
}
return s;
}
}


加同步的方式:同步代码块和同步函数。

两种方法比较低效。

而用双重否定可以解决这个效率问题。

加同步的时候使用的锁是哪一个?

该锁是该类所属的字节码文件对象。

下面是一个延时加载的实例。

class single{

private single(){}
private static single s=null;
public static single getInstance(){
if(s==null){
synchronized(Single.class)//同步锁
{
if (s==null)
{
s=single.getInstance();
}
}
}
return s;
}
}
public class SingleDemo {
public static void main(String[] args)
{
single ss=single.getInstance()
}
}


————– android培训、java培训、java学习型技术博客、期待与您交流! ———–
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员