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

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

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

java 复制代码
public interface Iterable<T> {
    Iterator<T> iterator();
    
    ...
}

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

java 复制代码
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();
        }
    }
}
java 复制代码
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 中的一个迭代器对象:

java 复制代码
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 新手来说都不陌生:

kt 复制代码
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,这是不是就是一个工厂模式的结构呢?其实设计模式离我们非常近!

相关推荐
Whisper_Sy7 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 网络状态实现
android·java·开发语言·javascript·网络·flutter·php
ujainu9 小时前
Flutter + OpenHarmony 网格布局:GridView 与 SliverGrid 在鸿蒙设备内容展示中的应用
android·flutter·组件
龙之叶9 小时前
【Android Monkey源码解析五】- 异常处理
android·数据库
明道源码9 小时前
Android Studio AVD 模拟器的使用与配置
android·android studio
学海无涯书山有路10 小时前
Android FragmentContainerView 新手详解(Java 版)
android·java·开发语言
上海控安10 小时前
Android生态中的SDK安全问题解析
android·安全
aidou131410 小时前
Android中自定义日期选择器样式DatePickerDialog
android·dialog·日期选择器·时间选择器·datepicker·自定义样式·timepicker
建群新人小猿12 小时前
陀螺匠企业助手—个人简历
android·大数据·开发语言·前端·数据库
Mr Lee_14 小时前
attribute android:enableOnBackInvokedCallback not found
android
Jomurphys14 小时前
Compose - 使用 Reorderable
android