本文是对近期学习设计模式的总结,发现结合源码学习的设计模式理解起来会更快,如果有不严谨的地方,还望大哥们多多批评,本次主要讲解创建型设计模式,有工厂、抽象工厂、单例、建造者、原型这五种。
工厂
- UML图
- UML图大白话解释:首先存在一个接口Button,含有一个方法render,而ButtonA与ButtonB对这个render方法含有不同的解释,另外有个类Dialog,其中包含了一个以Button为返回类型的方法,DialogA与DialogB都继承于Dialog类,在实现getButton时,两者采取了Button的不同实现类。
- 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)处与(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对象
-
-
Iterator工厂模式关系图
- 第一次写博客总结一下设计模式,还望大佬们指导