简介
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。建造者模式属于创建型模式。以下两种情况适合采用建造者模式:
- 1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 2)当构造过程必须允许被构造的对象有不同表示时。
角色
在建造者模式中,有以下几个角色:
- Builder:接口,规定建造一个对象需要建造哪几部分。
- ConcreteBuilder:实现Builder的接口,实现各部分具体怎么建造。
- Director:构造一个使用Builder接口的对象,决定各部分的建造顺序。
- Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
使用示例
package org.iti.designmodel;
public class BuilderMode {
// 测试代码
public static void main(String[] args) {
DrawRect drawer = new Drawer();
Director director = new Director();
Rect rect = director.draw(drawer);
System.out.println(rect);
}
}
// 抽象建造者
interface DrawRect {
void drawLeftLine();
void drawTopLine();
void drawRightLine();
void drawBottomLine();
Rect buildRect();
}
// 具体建造者
class Drawer implements DrawRect {
Rect rect;
public Drawer(Rect rect) {
super();
this.rect = rect;
}
public Drawer() {
this.rect = new Rect();
}
@Override
public void drawLeftLine() {
rect.setLeftLine("Red Left Line");
}
@Override
public void drawTopLine() {
rect.setTopLine("Green Top Line");
}
@Override
public void drawRightLine() {
rect.setRightLine("Blue Right Line");
}
@Override
public void drawBottomLine() {
rect.setBottomLine("Yellow Bottom Line");
}
@Override
public Rect buildRect() {
return rect;
}
}
// 导演,规定各部分的建造顺序
class Director {
public Rect draw(DrawRect drawer) {
drawer.drawBottomLine();
drawer.drawLeftLine();
drawer.drawRightLine();
drawer.drawTopLine();
return drawer.buildRect();
}
}
// 产品
class Rect {
String leftLine;
String topLine;
String rightLine;
String bottomLine;
public String getLeftLine() {
return leftLine;
}
public void setLeftLine(String leftLine) {
this.leftLine = leftLine;
}
public String getTopLine() {
return topLine;
}
public void setTopLine(String topLine) {
this.topLine = topLine;
}
public String getRightLine() {
return rightLine;
}
public void setRightLine(String rightLine) {
this.rightLine = rightLine;
}
public String getBottomLine() {
return bottomLine;
}
public void setBottomLine(String bottomLine) {
this.bottomLine = bottomLine;
}
@Override
public String toString() {
return "Rect [leftLine=" + leftLine + ", topLine=" + topLine
+ ", rightLine=" + rightLine + ", bottomLine=" + bottomLine
+ "]";
}
}
运行结果如下: