用Java和Android源码理解创建型设计模式,原来设计模式就在身边——工厂模式

155 阅读1分钟

本文是对近期学习设计模式的总结,发现结合源码学习的设计模式理解起来会更快,如果有不严谨的地方,还望大哥们多多批评,本次主要讲解创建型设计模式,有工厂、抽象工厂、单例、建造者、原型这五种。

工厂

  1. UML图

设计模式.png

  • UML图大白话解释:首先存在一个接口Button,含有一个方法render,而ButtonA与ButtonB对这个render方法含有不同的解释,另外有个类Dialog,其中包含了一个以Button为返回类型的方法,DialogA与DialogB都继承于Dialog类,在实现getButton时,两者采取了Button的不同实现类。
  1. Java中的工厂模式
  • Iterator

Java中的Iterator就是个最简单的工厂模式,如下代码是个日常的Iterator使用

int[] arr = new int[]{1,2,3};
ArrayList<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
initlize(linkedList,arr);
initlize(arrayList,arr);
Iterator<Integer> iterator1 = arrayList.iterator();//获取ArrayList的Iterator对象(1)
Iterator<Integer> iterator2 = linkedList.iterator();//获取LinkedList的Iterator对象(2)
while (iterator1.hasNext()){
    System.out.println(iterator1.next());
}
while (iterator2.hasNext()){
    System.out.println(iterator2.next());
}
  1. 向下查看代码中(1)处与(2)处的源码

    • arrayList.iterator()

      • ArrayList.java
      public Iterator<E> iterator() {
                  return new Itr();
                  } 
      
      • Itr.java
      private class Itr implements Iterator<E> {
          int cursor;       // index of next element to return
          int lastRet = -1; // index of last element returned; -1 if no such
          int expectedModCount = modCount;
      
          // prevent creating a synthetic constructor
          Itr() {}
      
      • 此处可以看到arrayList.iterator返回了一个Itr对象,而Itr实现了Iterator接口。这里Iterator接口就是UML图里的Button接口,Itr就是ButtonA, ArrayList为DialogA,ArrayList的父类AbstractList为Dialog,AbstractList中包含了以Iterator为返回值的方法
      • AbstractList.java
      public Iterator<E> iterator() {
          return new Itr();
      }
      
    • linkedList.iterator()

      • linkedList.java(linkedList继承于AbstractSequentialList)
      public class LinkedList<E>
          extends AbstractSequentialList<E>
          implements List<E>, Deque<E>, Cloneable, java.io.Serializable
      
      • AbstractSequentialList
      public Iterator<E> iterator() {
          return listIterator();
      }
      
      • 可见iterator方法返回了一个listIterator对象,最终到底是个ListItr对象
  2. Iterator工厂模式关系图

设计模式 (1).png

  1. 第一次写博客总结一下设计模式,还望大佬们指导