【Android】源码中的工厂方法模式

本文是基于 Android 14 的源码解析

工厂方法模式应用很广泛,我们平时开发中经常会使用到的数据结构中其实也隐藏着对工厂方法模式的应用,以 List 和 Set 为例,List 和 Set 都继承于 Collection 接口,而 Collection 接口继承于 Iterable 接口,Iterable 接口如下:

public interface Iterable<T> {
    Iterator<T> iterator();
    
    ...
}

这意味着 List 和 Set 接口也会继承该方法,平时比较常用的两个间接实现类 ArrayList 和 HashSet 中 iterator 方法的实现就是构造并返回一个迭代器对象:

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    public Iterator<E> iterator() {
        return new Itr();
    }

    private class Itr implements Iterator<E> {
        int cursor = 0;

        int lastRet = -1;

        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size();
        }

        public E next() {
            checkForComodification();
            try {
                int i = cursor;
                E next = get(i);
                lastRet = i;
                cursor = i + 1;
                return next;
            } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException(e);
            }
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                AbstractList.this.remove(lastRet);
                if (lastRet < cursor)
                    cursor--;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException e) {
                throw new ConcurrentModificationException();
            }
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }
}
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
}

HashSet 的 iterator 方法中会返回成员变量 map 中对应 HashSet 对象元素的迭代器对象,最终返回的是 KeySet 中的一个迭代器对象:

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
    final class KeySet extends AbstractSet<K> {
        public final Iterator<K> iterator() {
            return new KeyIterator();
        }
    }
}

ArrayList 和 HashSet 中的 iterator 方法其实就相当于一个工厂方法,专为 new 对象而生,这里 iterator 方法是构造并返回一个具体的迭代器。

Android 中对工厂方法模式的应用更多,相信以下代码对一个 Android 新手来说都不陌生:

class TestAActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

实质上,onCreate 方法就相当于一个工厂方法,在 TestAActivity 的 onCreate 方法中构造一个 View 对象,并设置为当前界面的 ContentView 返回给 Framework 处理,如果现在又有一个 TestBActivity,这时我们又在其 onCreate 方法中通过 setContentView 方法设置另外不同的 View,这是不是就是一个工厂模式的结构呢?其实设计模式离我们非常近!

相关推荐

  1. Android工厂方法模式

    2024-03-16 08:22:04       41 阅读
  2. Android单例模式

    2024-03-16 08:22:04       35 阅读
  3. Spring抽象工厂模式

    2024-03-16 08:22:04       34 阅读
  4. Spring简单工厂模式

    2024-03-16 08:22:04       41 阅读
  5. 如何在Android Framework增加jni方法

    2024-03-16 08:22:04       48 阅读
  6. C++工厂方法模式

    2024-03-16 08:22:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 08:22:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 08:22:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 08:22:04       87 阅读
  4. Python语言-面向对象

    2024-03-16 08:22:04       96 阅读

热门阅读

  1. Kafka主题二三事

    2024-03-16 08:22:04       39 阅读
  2. 【 React 】在React 项目是如何捕获错误的?

    2024-03-16 08:22:04       47 阅读
  3. 考研模拟面试-题目【攻略】

    2024-03-16 08:22:04       43 阅读
  4. 在Ubuntu系统中使用Systemctl添加启动项的详细指南

    2024-03-16 08:22:04       36 阅读
  5. AcWing 4405. 统计子矩阵(双指针,前缀和)

    2024-03-16 08:22:04       37 阅读
  6. 大模型基本概念和分类介绍总结

    2024-03-16 08:22:04       49 阅读