1 准确定义
将一个复杂对象的创建和表示分离,使得同样的创建过程可以得到不同的表示。
2 适用场景
用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
3 优势
使得建造代码和表示代码分离。由于建造者隐藏了产品是如何组装的,因此如果需要改变一个产品的内部表示时,只需要再添加一个ConcreteBuilder即可。
4 注意
- 建造者模式中一个很重要的类:Director(指挥者)。
- 建造者模式是逐步建造产品的。
- 建造者Builder里面的建造方法要足够普遍。
5 UML图
ConcreteBuilder1和2依赖Product类,Product是它们的属性。
6 例子
6.1 UML图
6.2 code
Client
package designmodel.thirteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:45
* @ProjectName: JavaBaseTest
*/
public class Client {
public static void main(String[] args) {
Director director=new Director();
ConcreteBuilder1 concreteBuilder1=new ConcreteBuilder1();
director.build(concreteBuilder1);
Product product1=concreteBuilder1.getProduct();
ConcreteBuilder2 concreteBuilder2=new ConcreteBuilder2();
director.build(concreteBuilder2);
Product product2=concreteBuilder2.getProduct();
//输出product1
System.out.println("product1:");
for(String str:product1.product)
System.out.println(str);
System.out.println("---------");
//输出product2
System.out.println("product2:");
for(String s:product2.product)
System.out.println(s);
}
}
Director
package designmodel.thirteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:43
* @ProjectName: JavaBaseTest
* 指挥者
*/
public class Director {
public void build(Builder builder){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
Builder
package designmodel.thirteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:35
* @ProjectName: JavaBaseTest
*/
public interface Builder {
//为产品添加各个组成部分
void buildPartA();
void buildPartB();
void buildPartC();
//返回创建的产品
Product getProduct();
}
ConcreteBuilder1
package designmodel.thirteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:39
* @ProjectName: JavaBaseTest
*/
public class ConcreteBuilder1 implements Builder {
Product product;
ConcreteBuilder1(){
product=new Product();
}
@Override
public void buildPartA() {
product.addProperties("添加部件A");
}
@Override
public void buildPartB() {
product.addProperties("添加部件B");
}
@Override
public void buildPartC() {
product.addProperties("添加部件C");
}
@Override
public Product getProduct() {
return product;
}
}
ConcreteBuilder2
package designmodel.thirteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:41
* @ProjectName: JavaBaseTest
*/
public class ConcreteBuilder2 implements Builder {
Product product;
ConcreteBuilder2(){
product=new Product();
}
@Override
public void buildPartA() {
product.addProperties("添加部件X");
}
@Override
public void buildPartB() {
product.addProperties("添加部件Y");
}
@Override
public void buildPartC() {
product.addProperties("添加部件Z");
}
@Override
public Product getProduct() {
return product;
}
}
Product
package designmodel.thirteenthchapter;
import java.util.ArrayList;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:31
* @ProjectName: JavaBaseTest
*/
public class Product {
ArrayList<String> product=new ArrayList<>();
public void addProperties(String str){
product.add(str);
}
}
参考
https://blog.csdn.net/caoxiaohong1005/article/details/79007314