首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

谈谈23种设计模式在Android项目中的应用(3)

谈谈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连接数据库的操作中,对不同的数据库的操作而形成的的对象操作族,但是当再次更换数据时,所需要造成的接口的修改也十分麻烦,所以扩展性不好
继承事业,薪火相传
返回列表