前言:
参考图书:软件设计模式与体系结构
参考博客:(1)http://www.runoob.com/design-pattern/builder-pattern.html
(2)https://www.cnblogs.com/wanson/articles/9277813.html
(3)https://blog.csdn.net/carson_ho/article/details/54910597
开始:
生成器模式与工厂方法模式有相似之处,因为两者都属于创建型模式!大家开始可能会绝得两者差不多,但是将代码写完以后就会发现
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
UML如下
产品:宝马
package cn.gxm.Builder;
/**
* 需要生产的宝马
* 现在只是一个空的框架
* @author xiaomi
*
*/
public class Product {
private String light;//车灯
private String engine;//引擎
private String tire;//轮胎
public String getLight() {
return light;
}
public void setLight(String light) {
this.light = light;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getTire() {
return tire;
}
public void setTire(String tire) {
this.tire = tire;
}
public Product(String light, String engine, String tire) {
super();
this.light = light;
this.engine = engine;
this.tire = tire;
}
@Override
public String toString() {
return "Product [light=" + light + ", engine=" + engine + ", tire=" + tire + "]";
}
public Product() {
}
}
工人师傅:接口
package cn.gxm.Builder;
/**
* 建造宝马的各个部件(接口)
* 工人师傅
* @author xiaomi
*
*/
public interface Builder {
//需要一个宝马的框架,然后构造师向里面添加部件
public Product product = new Product();
//构造车灯
public void createLight();
//构造引擎
public void createEngine();
//构造轮胎
public void createTire();
//将组装好的宝马,准备好!谁要就给谁
public Product getProduct();
}
正真的工人师傅:类
package cn.gxm.Builder;
/**
* 建造各个部件
* @author xiaomi
*
*/
public class ConcreteBuilder implements Builder{
@Override
public void createLight() {
product.setLight("高档车灯");
}
@Override
public void createEngine() {
product.setEngine("高档引擎");
}
@Override
public void createTire() {
product.setTire("高档轮胎");
}
@Override
public Product getProduct() {
return product;
}
}
组装人员(指挥者)
package cn.gxm.Builder;
/**
* 使用builder向product中组装
*
* @author xiaomi
*
*/
public class Director {
private Builder builder;
//老板需要组装人员把装好的宝马拿来
public Director(Builder builder) {
this.builder = builder;
}
//老板使用工人师傅带来的宝马配件组装成一个宝马,给客人看
public Product Show() {
builder.createEngine();
builder.createLight();
builder.createTire();
return builder.getProduct();
}
}
客人来买宝马
package cn.gxm.Builder;
public class Client {
public static void main(String[] args) {
//客人先找老板(但是老板就是指挥者)
//但是指挥者并没有宝马配件,所以找来了造宝马各个部件的工人师傅
Builder builder = new ConcreteBuilder();
//指挥者(老板)指挥工人师傅把宝马的各个零件给装配成一个完整的宝马!
Director director = new Director(builder);
//老板弄好的宝马给客人看
Product product = director.Show();
System.out.println(product.toString());
}
}
写完的那么一瞬间,感觉好像和工厂模式似曾相识,但大家再仔细想一下 建造者模式更加关注与零件装配的顺序。
应用实例: | 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。 |
优点: | 1、建造者独立,易扩展。 2、便于控制细节风险。 |
缺点: | 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。 |
使用场景: | 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖 |