【Android进阶】设计模式------Singleton单例的几种实现方式

来源:互联网 发布:qt tcp客户端编程 编辑:程序博客网 时间:2024/05/29 07:50

写在开头的几句话:
无论什么时候都觉得自己的技能不足,毕业半年,之后进了一家创业公司,公司前景不是很好,而且略有拖工资,最主要是觉得自己学不到东西。正好赶上有空闲的时间,就看了看很多大神写的博客,记得博客上写的一句话,一个程序员要从自身做起,少范低级错误,少出BUG,做一个高水平的工程师,而不是天天Debug的码农。
我想我是爱这行的,所以啊,加油吧,程序员君。

单例模式

•使用场景
•实现方式

使用场景

我也用过很多次单例,每一次用,无非就是要用到的这个类很耗内存,很耗时间,所以也就没必要new多个这个类的对象,所以单例应该是用在这几种形式上的。

实现方式

单例的实现起来应该简单的很,查资料过后,也就是几个关键点:
1.最重要的是构造函数的private。
2.通过一个静态方法或者枚举返回单例对象。
3.多线程环境下要确保单例对象依然只有一个。
4.反序列化过后的singleton依然是序列化之前的singleton(挺拗口)。
讲道理的话,3、4是我没查资料之前都忽略了的,应该也是单例中较难的点。

好了废话不多说,上代码吧

拿LOL说事情吧,LOL的商店只能有一个吧,无论是谁用都是用那个商店
并且在几个英雄同时操作商店的时候,也就是多线程的时候,商店也只能有一个。

public class LOLStore {    private static LOLStore store = null;    private ArrayList<HashMap<String, Integer>> ADWeaponList;//AD武器列表    private ArrayList<HashMap<String, Integer>> APWeaponList;//AP武器列表    private HashMap<String, Integer> weaponMap; //武器    //私有的构造函数;    private LOLStore() {    }    //懒汉式    public static LOLStore getStore() {        if (null == store) {            store = new LOLStore();        }        return store;    }    private void addWeapon() {        ADWeaponList = new ArrayList<>();        APWeaponList = new ArrayList<>();        weaponMap = new HashMap<>();        weaponMap.put("无尽之刃", 3600);        ADWeaponList.add(weaponMap);        weaponMap.put("卢登的回声", 3200);        APWeaponList.add(weaponMap);    }   public ArrayList showADWeapon() {        return ADWeaponList;    }}

然后是英雄类,拿大盖伦说事情

public class LOLGaren {    //英雄盖伦想要用商店    public static void main(String[] args) {  LOLStor.getStore().showADWeapon();    }}

然后一个简单的单例就写完了,用的是懒汉式

几种单例的常见形式

DCL:

    private static volatile LOLStore store = null;    //DCL式:    public static LOLStore getStore() {        if (null == store) {            synchronized (LOLStore.class) {                if (store == null) {                    store = new LOLStore();                }            }        }        return store;    }

静态内部类:

 //静态内部类式:    public static LOLStore getStore() {        return SingltonHolder.store;    }    //内部类    private static class SingltonHolder{        private static final LOLStore store = new LOLStore();    }

还有枚举和饿汉式,我就不写了,我感觉枚举的用不到,饿汉式又太简单,还有一种形式是容器模式,这种形式在源码中看到过,用到了Map<>,这个在分析源码的时候再写吧。

上面的很多内容都是通过查资料得到的,其中出自《Android源码设置模式》一书中。

0 0
原创粉丝点击