建造者模式的使用场景
-
相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
-
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可 以使用该模式。
-
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建 造者模式非常合适。
其实到了这里我们大体的了解到了我们建造者模式的两个核心点就是一个是固定的组件(对象),还有就是可以灵活的进行顺序组装我们的组件,满足客户端Client的需要。
建造者模式的含义
建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:
Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)
场景案例
我们要实现的案例是编写一个套餐类,套餐中的组件为汉堡、可乐、薯条,我们要实现能够灵活的创建各种套餐,例如汉堡+薯条、汉堡+可乐、汉堡+薯条+可乐等。下图为应用到设计的建造者模式的类图:
代码实现
FoodPackage.java
@Data
public class FoodPackage {
/**
* 炸薯条
*/
private String fries;
/**
* 可乐
*/
private String cola;
/**
* 汉堡
*/
private String hamburg;
public FoodPackage(FoodBuilder foodBuilder) {
this.fries = foodBuilder.fries;
this.cola = foodBuilder.cola;
this.hamburg = foodBuilder.hamburg;
}
public static class FoodBuilder {
/**
* 炸薯条
*/
private String fries;
/**
* 可乐
*/
private String cola;
/**
* 汉堡必选
*/
private String hamburg;
public FoodBuilder(String hamburg) {
this.hamburg = hamburg;
}
public FoodBuilder setCola(String cola) {
this.cola = cola;
return this;
}
public FoodBuilder setFries(String fries) {
this.fries = fries;
return this;
}
public FoodPackage build() {
return new FoodPackage(this);
}
}
}
Client.java
public class Client {
public static void main(String[] args) {
// 套餐1 牛肉汉堡+可乐
new FoodPackage.FoodBuilder("牛肉汉堡").setCola("可乐").build();
// 套餐2 牛肉汉堡+薯条
new FoodPackage.FoodBuilder("牛肉汉堡").setCola("可乐").build();
// 套餐3 牛肉汉堡+可乐+薯条
new FoodPackage.FoodBuilder("牛肉汉堡").setCola("可乐").setFries("薯条").build();
}
}