谈谈23种设计模式在Android项目中的应用(3)
- UID
- 1029342
- 性别
- 男
|
谈谈23种设计模式在Android项目中的应用(3)
ArrayListIterator类型定义如下:
private class ArrayListIterator implements Iterator {
/** Number of elements remaining in this iteration */
private int remaining = size;
/** Index of element that remove() would remove, or -1 if no such elt */
private int removalIndex = -1;
/** The expected modCount value */
private int expectedModCount = modCount;
public boolean hasNext() {
return remaining != 0;
}
@SuppressWarnings("unchecked") public E next() {
ArrayList ourList = ArrayList.this;
int rem = remaining;
if (ourList.modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
if (rem == 0) {
throw new NoSuchElementException();
}
remaining = rem - 1;
return (E) ourList.array[removalIndex = ourList.size - rem];
}
public void remove() {
Object[] a = array;
int removalIdx = removalIndex;
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
if (removalIdx < 0) {
throw new IllegalStateException();
}
System.arraycopy(a, removalIdx + 1, a, removalIdx, remaining);
a[--size] = null; // Prevent memory leak
removalIndex = -1;
expectedModCount = ++modCount;
}
}
我们看到这个类实现了Iterator接口,接口的定义如下:
public interface Iterator {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
基本的结构也分析完了,接下来对号入座,看一看具体是如何实现工厂方法模式的。
Iterator————>Product ArrayListIteratorr————>ConcreteProduct
Iterable/List————>Factory ArrayList————>ConcreteFactory
工厂方法使一个类的实例化延迟到子类,对应着将迭代器Iterator的创建从List延迟到了ArrayList。这就是工厂方法模式。
重构
暂无
抽象工厂模式
定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要制定他们的具体类
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
示例
public abstract class AbstractProductA{
public abstract void method();
}
public abstract class AbstractProdectB{
public abstract void method();
}
public class ConcreteProductA1 extends AbstractProductA{
public void method(){
System.out.println("具体产品A1的方法!");
}
}
public class ConcreteProductA2 extends AbstractProductA{
public void method(){
System.out.println("具体产品A2的方法!");
}
}
public class ConcreteProductB1 extends AbstractProductB{
public void method(){
System.out.println("具体产品B1的方法!");
}
}
public class ConcreteProductB2 extends AbstractProductB{
public void method(){
System.out.println("具体产品B2的方法!");
}
}
public abstract class AbstractFactory{
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
public class ConcreteFactory1 extends AbstractFactory{
public AbstractProductA createProductA(){
return new ConcreteProductA1();
}
public AbstractProductB createProductB(){
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 extends AbstractFactory{
public AbstractProductA createProductA(){
return new ConcreteProductA2();
}
public AbstractProductB createProductB(){
return new ConcreteProductB2();
}
}
Android
由于该模式存在的局限性,Android中很少有用到这个模式的地方,com.android.internal.policy包下的IPolicy有使用到这个模式,它是关于Android窗口,窗口管理,布局加载,以及事件回退Handler这一系列窗口相关产品的抽象工厂,但是其在源码中其实也只有一个具体的工厂实现。因为这部分结构较为复杂,代码量大,有兴趣的同学可以自己去查看相关资料或者阅读源码。
与工厂方法模式对比
使用
不依赖于产品类实例如何被创建,组合和表达的细节;
产品有多于一个的产品族,而系统只消费其中某一族的产品;
同属于同一个产品族是在一起使用的;
提供一个产品类的库,所有产品以同样的接口出现,从而使使用者不依赖于实现;
区别
抽象工厂是面向一个工厂方法的升级;
抽象方法提供的是一个产品族,即多个产品等级结构,而工厂方法则是针对一个产品等级结构;
抽象方法提供的产品是衍生自多个抽象或者接口,而工厂方法则衍生自同一个抽象或者接口;
优点
抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
(可以把示例中的AB当做等级,12当做族群,A1B1属于同一族群不同等级,当添加同一等级下新的产品时很方便,但是要添加不同等级的产品就会破坏“开闭原则”)
由于抽象工厂不易于拓展新的产品族,所以这种设计模式,在提供对外部人员访问时,很少使用,也有人说抽象工厂方法模式是一种很“恶心”的设计模式,运用最为典范的一个是该模式最初的目的,也就是为了适应Unit和Windows两个操作系统下的视图而构建视图族,视图族有各自不同的实现;另一个就是Java连接数据库的操作中,对不同的数据库的操作而形成的的对象操作族,但是当再次更换数据时,所需要造成的接口的修改也十分麻烦,所以扩展性不好 |
|
|
|
|
|