建造者模式
应用场景
-
需要构建一个复杂的对象,同时它里面的许多构建细节对于不同情况要有不同的操作,这时就可以使用建造者模式。也就是这个复杂的对象内部的构建顺序其实是稳定的,但是其内部的具体的构建细节是复杂多变的。
-
使用了建造者模式,用户创建的时候只要指定需要的类型,就可以自动创建好了,用户不需要知道里面的创建细节。
Builder
是为了创建一个Product
对象的各个部件而指定的接口,ConcreteBuilder
是具体的建造者,实现Builder
接口构建具体的产品组件,
Product
package 结构;
import java.util.ArrayList;
import java.util.List;
/**
* @Program: 设计模式
* @Description: 产品类,有多个组件完成
* @Author Mokairui
* @Date 2020/12/27 22:18
*/
public class Product {
List<String> parts = new ArrayList<>();
// 添加产品部件
public void add(String part) {
parts.add(part);
}
// 创建产品的过程
public void show() {
System.out.println("产品创建-------");
parts.forEach(System.out::println);
}
}
-
Builder
package 结构; /** * @Program: 设计模式 * @Description: 建造者类,确定产品又两个部件PartA和PartB完成,并声明一个得到产品的方法GetResult * @Author Mokairui * @Date 2020/12/27 22:22 */ public interface Builder { void buildPartA(); void buildPartB(); Product getResult(); }
-
ConcreteBuilderA
package 结构; /** * @Program: 设计模式 * @Description: * @Author Mokairui * @Date 2020/12/28 20:37 */ public class ConcreteBuilderA implements Builder { private Product product = new Product(); @Override public void buildPartA() { product.add("部件 A"); } @Override public void buildPartB() { product.add("部分 B"); } @Override public Product getResult() { return product; } }
-
ConcreteBuilderB
package 结构; /** * @Program: 设计模式 * @Description: * @Author Mokairui * @Date 2020/12/28 20:37 */ public class ConcreteBuilderB implements Builder { private Product product = new Product(); @Override public void buildPartA() { product.add("部件 X"); } @Override public void buildPartB() { product.add("部分 Y"); } @Override public Product getResult() { return product; } }
-
Director
package 结构; /** * @Program: 设计模式 * @Description: 指挥者类 * @Author Mokairui * @Date 2020/12/27 22:28 */ public class Director { public void construct(Builder builder) { builder.buildPartA(); builder.buildPartB(); } }
-
Demo
package 结构; /** * @Program: 设计模式 * @Description: * @Author Mokairui * @Date 2020/12/28 20:41 */ public class Demo { public static void main(String[] args) { Director director = new Director(); Builder b1 = new ConcreteBuilderA(); Builder b2 = new ConcreteBuilderB(); director.construct(b1); Product p1 = b1.getResult(); p1.show(); director.construct(b2); Product p2 = b2.getResult(); p2.show(); } }