(一)设计模式之单例模式

来源:互联网 发布:异或 c语言 编辑:程序博客网 时间:2024/06/05 16:17
懒惰已经是我的天性,如果想自己让自己写点东西,那根本不可能,也许这就是正常人中的普通人所具备的基本特征吧~但是人总是要改变,而我的所谓改变,我想着是从今日起,每天开始记录自己所学到的,或者说是遇到的一些东西,加着自己的理解做一记录,好让以后回头发现自己还在些残留的东西值得回忆。自从知道设计模式到简单的用设计模式已经有3年之久了,但是让我说出来的所以然,貌似是不可能的,因为懒人从来不去更深入的去问为什么。但是发现工作几年了,再出去面试,却跟刚毕业或者是毕业一年所问的东西都不一样了,什么设计模式、网络协议、框架重构、代码优化等等,也许你会瞬间发现自己干了几年,也就是个搬用工,将别人的东西搬过来,让后再垒上去~~~呜呼哀哉啊~~~单例模式分为两种:一:饿汉式;二:懒汉式,我一般自己叫饱汉式,吃饱了的人容易懒惰。从字面可以想出来'饿'、'饱'的含义,那么从人性的角度出发,如果你在特别饥饿的情况下自然是想着吃饱的问题,在饱了的情况下,自然会去想其他的问题,而不是为吃不饱而发愁,也就是说,假如有一个馒头,非常饿的人会去抢着吃,不饿的人自然不会有太大的动作。这是根据生活去分析的。那么实际应用中,饿汉式是指对象一开始就已经创建好了,以后的任何时间都不需要再创建该对象,创建方式:

public static class Singleton{
//在自己内部定义自己的一个实例,只供内部调用
private static final Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
,懒汉式则是在需要该对象的时候进行创建,创建方式:public class SingletonClass{
private static SingletonClass instance=null;
public static SingletonClass getInstance()
{
if(instance==null)
{
instance=new SingletonClass();
}
return instance;
}
private SingletonClass(){
}
}
,其实写起来是很简单的,只要是懂java的人基本都一看就懂,当然也需要我们经常应用,才可熟练,并且我们还得了解二者的优缺点。
优缺点:饿汉式,之前也通俗的说了,其实就是对象一开始就创建了,自然创建对象就需要占用内存(内存这个字眼在Android开发中是比较突出的),那么以后就不需要再创建了,省去了创建对象的时间,因此是一个典型的用内存换取时间。懒汉式,则正好相反,就是在每一次调用的工程中,先得去判断对象是否已经创建,如果不存在该对象,则创建。那么要比饿汉式多了一步判断逻辑,浪费了时间,但省下来了内存,因此,又是一个用时间换取内存。在安全方面:饿汉式自然是线程安全的,因为对象已经创建,不存在多个线程抢着创建该对象的问题,自然懒汉式在不加同步(synchronized)的情况下是不安全地,如果我们有A:线程在执行对象创建方法,但是没有创建成功,而B线程却已经进入了判断对象为空方法的里面,这样就会创建出两个对象出来,也就是所谓的线程并发,因此是不安全的,当然这样情况根据实际运用去选择怎么使用。因为有这种线程不安全问题,为完善该问题有引出了”双重锁“方法,写法如下:

public static class Singleton{    private static Singleton instance=null;    private Singleton(){        //do something    }    public static Singleton getInstance(){        if(instance==null){            synchronized(Singleton.class){                if(null==instance){                    instance=new Singleton();                }            }        }        return instance;    }}

看写法,第一重则是直接判断对象是否存在,第二重则加了安全机制,然后再次判断是否对象存在,这样的写的好处是如果我们直接用第二重的写法,也就意味着每次调用都会改方法,而且会导致别的线程无法去调用该方法,如果有很多线程同时执行,那是相当耗费时间的,如果在Android中,则会导致应用长时间等待,出现ANR(Application Not Responding),因此多了第一重的非安全锁判断,大大减少了访问时间。
有看到的朋友希望不要喷我哦,这个只是我个人的大体理解~~

0 0