Android设计模式

Android设计模式-1-单例模式

2018-05-30  本文已影响57人  今阳说

1. 定义:

2. 优缺点

3. android源码中的体现:

  - getLayoutInflater()
  - LayoutInflater.from(context)
  - (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE)

其实前两种最后都是调用的最后一种,是获取系统服务经常用到的方法,这只是一个典型的单例的使用场景,其实在Android源码中用到单例的情况还有很多。

4. 几种实现方式

  1. 饿汉式:在声明变量时就创建该实例
    • 优点:线程安全,多线程中使用不会出现创建多个实例的情况
    • 缺点:比较消耗计算机资源
    public class A {
        private static final A a = new A();

        private A() {
            if (a!=null)//这样可以防止通过反射创建该类的实例对象
                throw new AssertionError();
        }

        public static A getInstance() {
            return a;
        }

        //该类的一些方法,供实例调用
        public void doSomething() {
            LjyLogUtil.i(String.format("%s: do sth....", this.getClass().getName()));
        }
    }
  1. 懒汉式:使用到时才创建实例
  public class B {
        private static B b;

        private B() {
        }

        public static synchronized B getInstance() {
            if (b == null) {
                b = new B();
            }
            return b;
        }
        
        public void doSomething() {
            LjyLogUtil.i(String.format("%s: do sth....", this.getClass().getName()));
        }
    }
  1. 懒汉式+双重校验锁:DCL ( Double Check Lock)
  /**
  *  懒汉式+双重校验锁
  *  实现Serializable接口,支持序列化
  */
  public class C implements Serializable {
        private static C c;

        private C() {
        }

        public static C getInstance() {
            if (c == null) {
                synchronized ((C.class)) {
                    if (c == null) {
                        c = new C();
                    }
                }
            }
            return c;
        }

        public void doSomething() {
            LjyLogUtil.i(String.format("%s: do sth....", this.getClass().getName()));
        }

        //若要避免单例对象在反序列化时生成新的对象,就必须加入下面方法
        private Object readResolve() throws ObjectStreamException {
            return c;
        }

   }

  1. 通过静态内部类实现单例
  public class Dog {

        private Dog() {
        }

        public static Dog getInstance() {
            return DogHolder.dogInstance;
        }

        private static class DogHolder {
            private static Dog dogInstance = new Dog();
        }

        public void doSomething() {
            LjyLogUtil.i(String.format("%s: do sth....", this.getClass().getName()));
        }
    }
  1. 枚举单例:写法简单,线程安全,并且保证任何情况都是单例
  public enum D {

        INSTANCE;

        public void doSomething() {
            LjyLogUtil.i(String.format("%s: do sth....", this.getClass().getName()));
        }
    }
  1. 使用容器实现单例:可以管理多种类型的单例
  public class SingletonManager {

        private static Map<String, Object> instanceMap = new HashMap<>();

        private SingletonManager() {
        }

        public static void registerInstance(String key, Object instance) {
            if (!instanceMap.containsKey(key)) {
                instanceMap.put(key, instance);
            }
        }

        public static Object getInstance(String key) {
            return instanceMap.get(key);
        }
    }
上一篇下一篇

猜你喜欢

热点阅读