Android开发经验谈Android技术知识面试

Builder模式及原型模式

2018-09-08  本文已影响24人  某昆

本文主要内容

本文介绍两种简单的设计模式,Builder模式和原型模式。

1、Builder模式定义

Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

在android中经常能看到各种 Builder,通过 Builder 设置参数,最后生成对象。回顾这些使用场景,基本我们能联想到,如果一个对象要设定的参数特别多,物象比较复杂,则可以使用 Builder 模式。

Builder 模式UML图

其中Director是指组装过程。

2、Builder模式

Builder模式比较简单,此处直接上代码

public abstract class Computer {

protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer() {
}
public void setBoard(String board) {
    this.mBoard = board;
}
public void setDisplay(String display) {
    this.mDisplay = display;
}
public abstract void setOs();
@Override
public String toString() {
    return "computer mBoard = " + mBoard + "  mDisplay = " + mDisplay
            + "  mOs = " + mOs;
}
}

public class MacBook extends Computer{

@Override
public void setOs() {
    mOs = "Mac OS";
}

protected MacBook(){};
}

public abstract class Builder {

public abstract void buildBoard(String board);

public abstract void buildDisplay(String display);

public abstract void buildOs();

public abstract Computer create();
}
public class MacBookBuilder extends Builder{

private Computer mComputer = new MacBook();

@Override
public void buildBoard(String board) {
    mComputer.setBoard(board);
}

@Override
public void buildDisplay(String display) {
    mComputer.setDisplay(display);
}

@Override
public void buildOs() {
    mComputer.setOs();
}

@Override
public Computer create() {
    return mComputer;
}

}
public class Director {

Builder mBuilder = null;

public Director(Builder builder){
    mBuilder = builder;
}

public void construct(String board, String display){
    mBuilder.buildBoard(board);
    mBuilder.buildDisplay(display);
    mBuilder.buildOs();
}

public static void main(String[] args) {
    Builder builder = new MacBookBuilder();
    Director director = new Director(builder);
    director.construct("主板", "显示器");
    System.out.println(builder.create());
}
}

3、原型模式定义

原型模式:用原型实例指定创建对象的各类,并通过拷贝这些原型创新的对象

原型模式在前文中有见识过一回,ConcurrentHashMap源码解析 一文中提到,ConcurrentHashMap内部存在一个Segment数组,它初始化了索引为0的Segment,数组上的其它元素则以0索引位上的元素为原型创建。

所以,当类初始化需要消化非常多的资源时,通过原型拷贝可以避免这些消耗,或者像ConcurrentHashMap一样,数组内的元素需要保持一致等情况,都可以使用原型模式。

原型模式UML图

4、原型模式

原型模式目前在我的博文里,其实有两处提及,其一就是上文的 ConcurrentHashMap源码解析 ,另外一处就是 说说深拷贝和浅拷贝

它最重要的一点就是通过克隆原始对象或者说复制原始对象,生成新对象。有一点非常重要的是,一定要通过深拷贝来生成新对象。浅拷贝生成的新对象,其内部引用对象仍然同原始对象共享,可能产生问题。

现在我们来回顾下深拷贝的主要两点内容:

所以深拷贝的核心,就是要在克隆的时候将内部的引用成员变量,手动克隆一次。

关于原型模式的示例代码,本文不再贴了,可以去 说说深拷贝和浅拷贝 一文查看。

上一篇下一篇

猜你喜欢

热点阅读