1、Builder模式介绍:
Builder模式是一步一步创建一个复杂对象的创建型模式, 它允许用户在不知道内部构建细节的情况下, 可以更精细地控制对象的构造流程. 该模式是为了将构建复杂对象的过程和它的部件解耦, 使得构建过程和部件的表示隔离开来;
2、Builder模式的定义:
将一个复杂对象的构建与他的表示分离, 使得同样的构建过程可以创建不同的表示;
3、Builder模式的使用场景:
- 1、相同的方法, 不同的执行顺序, 产生不同的事件结果时;
- 2、多个部件或零件, 都可以装配到一个对象中, 但是产生的运行结果又不相同时;
- 3、产品类非常复杂, 或者产品类中的调用顺序不同产生了不同的作用, 这个时候使用建造者模式非常合适;
- 4、当初始化一个对象特别复杂, 如参数多, 且很多参数都具有默认值时;
4、缺点:
- 1、会产生多余的Builder对象以及Director对象, 消耗内存;
- 2、关于缺点, 刚工作那会儿, 学了个Builder, 然后就在项目里面开始用, 结果创建了大量的Builder变量, 东施效颦了.
- 3、后来工作一段时间了, 对Builder有了一定的了解, 把以前的Builder稍微修改了一哈. 先把简单的示例代码贴上, 后边把自己实际工作中Builder的一点儿改进加上去;
5、代码示例:
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
protected Computer() {}
public void setBoard(String board) {
mBoard = board;
}
public void setDisplay(String display) {
mBoard = mDisplay;
}
public abstract void setOS();
@Override
public String toString() {
return "Computer [mBoard = " + mBoard + ", mDisplay = " + mDisplay + ", mOS = " + mOS + "]";
}
}
public class Macbook extends Computer {
protected Macbook(){}
@Override
public void setOS() {
mOS = "Mac OS X 10.10";
}
}
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 buildDisplay (String board) {
mComputer.setBoard(board);
}
@Override
public void builldDisplay(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, Stirng display){
mBuilder.buildBoard(board);
mBuilder.buildDisplay(display);
mBuilder.buildOS();
}
}
public class Test {
public static void main(String[] args) {
Builder builder = new MacbookBuilder();
Director director = new Director(builder);
director.construct("英特尔主板", "Dell显示器");
Systen.out.println("Computer Info:" + builder.create().toString());
}
}
网友评论