黑马程序员--单例设计模式

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

单例设计模式

设计模式由建筑行业引用而来,在建筑行业,刚开始建筑工人只干一些比较简单的工作,这时候,工人可以凭借自己出色的工作能力和经验,很好的去完成任务,这就如同我们早期编写的一些简单的代码。随着建筑行业的飞速发展,建筑物的复杂程度与要求也越来越高,但是,在这些复杂的建筑物中,总可以找到一些相同或者相似的解决方案,从而,形成了一种固定的模式。然而,利用Java开发项目也会经常遇到某一类的问题,针对这一类问题前人已经给出了最行之有效的方法,我们称之为设计模式。其实,它是一种设计思想。

Java中共有23种设计模式(注意:这些模式也可用于C++,因为它是一种思想,针对的是面向对象,在面向对象的语言里,它都是通用的。),我们熟悉的有:享元模式、单例设计模式、

今天我们就来谈谈单例设计模式:

所谓的单例就是保证一个类在内存中的对象唯一性。也就是说一个类在内存中有且只有一个对象。

应用场景:如火车上的厕所,对于多个对象使用同一个配置信息的时候,就需要保证该对象使用的唯一性。

那么如何保证对象的唯一性呢,

思路:

1, 如果一个类中要是可以new对象的话,那么程序可以用new创建N个对象,这时就不能保证对象的唯一性。这样就导致对象的不可控,所以,我们要做的就是不可让其它程序创建对象。这时,我们可以私有化该类的构造函数。

2, 我们不让其它程序创建对象,那么我们自己在该类中创建一个对象

3, 既然,我们已经创建好了对象,那么,我们就需要对外提供一个方法让其它程序获取该对象。

 

单例设计有两种表现形式:首先我们来看看:

(一)饿汉式(类一加载,对象就已经存在了)

根据上述的设计思路我们可以创建下面的代码:

class Single{

private Single(){}//私有构造函数,不让外界创建对象

Single s=new Single();//创建一个本类实例

public Single getInstance(){//要求返回的是本类对象,那么返回类型当然也就是本类类型:Single

        return s;

}

}

注意:此时,虽然我们做到了保证对象的唯一性,但是,我们该如何调用呢?

我们都知道,此时构造函数已经被私有化了,那么也就意味着对象的调用肯定是不成

的,那么剩下的就是靠类名调用了。

此时,我们需要对上面的程序进行修改:

static Single s=new Single();//创建的对象也是静态

public static Single getInstance(){//静态方法访问的成员也必须是静态的

        return s;

}

对外提供的访问方法被静态以后,静态方法访问的内容页必须是静态,也就意味着创

对象被静态,此时,我们可以通过Single. getInstance();方法调用,但是随着而来的安全隐患问题也来了,我们知道,静态是可以通过类名调用的,也就意味着我们可以在其他程序

中通过Single.s调用创建的对象,此时,还是无法保证对象的唯一性,我们也称之为不可控。所以,我们要做的是不能随意让其它成员访问可以通过private将其私有。此时,单例设计模式是:

       classSingle{

       privateSingle(){}

       privatestatic Single s=new Single();//私有内容,外界不能访问

       publicstatic Single getInstance(){//可以加参数,提供控制条件

              returns;

       }

}

 

(二)懒汉式(类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。)

       classSingle{

       privateSingle(){}

       privatestatic Single s=null;//成员变量s并没有对象的建立

       publicstatic Single getInstance(){

              if(s==null)//如果判断为空,进行初始化

                     s=newSingle();

              returns;

       }

}

对于对象没有先建立,只是创建好了引用,在返回方法中,进行判断并初始化,这种方式我们称之为单例设计模式的懒汉式或者延迟加载形式。

总结:我们在真实开发的时候,使用饿汉式比较多,因为你无论是先加载还是后加载,最终还是使用对象。还有就是相对于懒汉式安全性提高。懒汉式有一定的安全隐患,如:被多线程多发访问的时候,可能不能保证对象的唯一性。到那时,我们就需要修改代码,但是,带来的问题就是效率降低。

 

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值