单例模式

单例模式,我曾经面试的时候,面试官问我的问题,我可以正确回答对应的原理(眼高手低的娃一般都这样,记东西记住原理就很容易搞定应用),但是当时让我直接写,我没有写出来。不过公司还是录取了我!哈哈……

单例模式,其实就是一个类的实例只有一个的意思,一般在一个系统中比较“重”的实例会采用单例模式,防止系统中都是这个类的实例,占用大量的内存资源。比如数据库连接,一般都是单例模式,一般在一些ORM框架都会对session做单例处理。其实这里容易给人一种错觉,认为这种耗费资源的类都应该采用单例,但是在实际中某些应用是不能做成单例的,比如进程、线程,但是可以采用其它方式比较线程池、连接池这样的方法(用户用完以后不销毁,而是进行标记,可以再次利用),这些都在《现代操作系统原理》书中有说,目前对很多案例记得不是很清楚了,就随便提提。

废话不多说了,讲单例吧。

单例的两个特点:1.类仅有1个实例;2.提供唯一对外的访问点。

分析:第一个条件,类仅有一个实例,也就是说类在初始化的时候应该new,并且仅仅new一次。第二个条件,也就是说类要提供一个公共的方法,让其它类能够访问,而不让其它类随意的new。

class singleton{
    public static singleton onlyone = new singleton();

    private singleton(){};
}

sigleton就满足了单例的要求,通过一个静态变量,当类初始化时new一个实例,然后外部只能通过singleton.onlyone来访问这个唯一的singleton(构成唯一的访问点),同时构建函数是私有,这样就无法在类外部new新的对象实例。

后来看到有拓展型的单例,但是本质都一样的。

    class sigleton1{
        public static sigleton1 only=null;

        public static sigleton1 getInstance(){
            if(only ==null){
                only = new sigleton1();
            }
            return only;
        }

        private sigleton1(){};
    }

这种方法俗称为“懒汉式”,也就是需要的时候再初始化。

而又有“饥汉式”,在装载的时候就已经初始化好。

class sigleton2{
    public static final sigleton2 instance = new sigleton2();

    private sigleton2(){};

    public static sigleton2 getInstance(){
        return instance();
    }

}

不管类型如何变化,代码都有2个特征:1.定义静态变量,提供全局访问;2.构造函数私有。
记住单例的定义,任何拓展类型都只是在基础之上的小变化,不足记忆。

文章来自个人博客:http://nklongyi.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值