Builder模式及原型模式
本文主要内容
- Builder模式定义
- Builder模式
- 原型模式定义
- 原型模式
本文介绍两种简单的设计模式,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源码解析 ,另外一处就是 说说深拷贝和浅拷贝
它最重要的一点就是通过克隆原始对象或者说复制原始对象,生成新对象。有一点非常重要的是,一定要通过深拷贝来生成新对象。浅拷贝生成的新对象,其内部引用对象仍然同原始对象共享,可能产生问题。
现在我们来回顾下深拷贝的主要两点内容:
- 原始对象内通过clone方法生成的对象是一个新对象
- 原始对象内部的引用对象,无法通过clone方法生成新对象。只有基础数据类型和String类型可以生成新对象
所以深拷贝的核心,就是要在克隆的时候将内部的引用成员变量,手动克隆一次。
关于原型模式的示例代码,本文不再贴了,可以去 说说深拷贝和浅拷贝 一文查看。