建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者模式举例:去肯德基点餐,我们可以认为点餐就属于一个建造订单的过程。我们点餐的顺序是无关的,点什么东西也是没有要求的,可以单点,也可以点套餐,也可以套餐加单点,但是最后一定要点确认来完成订单。
抽象产品类Computer
public abstract class Computer {
// 主板
protected String board;
// 显示器
protected String display;
// 操作系统
protected String os;
protected Computer() {
}
public void setBoard(String board) {
this.board = board;
}
public void setDisplay(String display) {
this.display = display;
}
public abstract void setOs();
@Override
public String toString() {
return "主板型号:" + board + ", 显示器型号:" + display + ", 操作系统:" + os;
}
}
具体产品类MacBook
public class MacBook extends Computer {
protected MacBook() {
}
@Override
public void setOs() {
os = "Mac OS X 13";
}
}
抽象类Builder
public abstract class Builder {
abstract void buildBoard(String board);
abstract void buildDisplay(String display);
abstract void buildOs();
abstract Computer build();
}
具体的Builder
实现类,具体的创建对象的类
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
@Override
public void buildBoard(String board) {
computer.setBoard(board);
}
@Override
public void buildDisplay(String display) {
computer.setDisplay(display);
}
@Override
public void buildOs() {
computer.setOs();
}
@Override
public Computer build() {
return computer;
}
}
负责具体的构造Computer
,统一组建过程
public class Director {
Builder builder = null;
public Director(Builder builer) {
this.builder = builer;
}
public void construct(String board, String display) {
builder.buildDisplay(display);
builder.buildBoard(board);
builder.buildOs();
}
}
测试建造者模式的实现
public class Test {
public static void main(String[] args) {
Builder builder = new MacBookBuilder();
Director pcDirector = new Director(builder);
pcDirector.construct("英特尔主板", "Retina显示器");
Computer computer = builder.build();
System.out.println(computer.toString());
}
}
测试输出内容
主板型号:英特尔主板, 显示器型号:Retina显示器, 操作系统:Mac OS X 13
注意事项
为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder
设计模式解决这个问题,进行buid()
方法中创建对象,并且将builder
传入,该builder
中,维护了传入对象的成员变量。
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
优缺点
1、各个具体的建造者相互独立,有利于系统的扩展。
2、客户端不必知道产品内部组成的细节,便于控制细节风险。
3、产品的组成部分必须相同,这限制了其使用范围。
4、如果产品的内部变化复杂,该模式会增加很多的建造者类。
模式结构
1、产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
2、抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法。
3、具体建造者(Concrete Builder):实现Builder
接口,完成复杂产品的各个部件的具体创建方法。
4、指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
参考文章
1、http://c.biancheng.net/view/1354.html
2、https://www.runoob.com/design-pattern/builder-pattern.html
3、https://www.runoob.com/w3cnote/builder-pattern.html
本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-builder.html
最后更新:2020-08-14 14:32:44
Update your browser to view this website correctly. Update my browser now