1、准确定义:
将一个复杂对象的创建和表示分离,使得同样的创建过程可以得到不同的表示。
2、适用场景:
用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
3、优势:
使得建造代码和表示代码分离。
由于建造者隐藏了产品是如何组装的,因此如果需要改变一个产品的内部表示时,只需要再添加一个ConcreteBuilder即可。
4、注意:
4.1、建造者模式中一个很重要的类:Director(指挥者)。
4.2、建造者模式是逐步建造产品的。
4.3、建造者Builder里面的建造方法要足够普遍。
5、UML图:
6、例子
6.1、UML图
6.2、code
依次为:Client,Director,Builder,ConcreteBuilder1,ConcreteBuilder2,Product
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);
}
}
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();
}
}
package designmodel.thirteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/7 23:35
* @ProjectName: JavaBaseTest
*/
public interface Builder {
//为产品添加各个组成部分
void buildPartA();
void buildPartB();
void buildPartC();
//返回创建的产品
Product getProduct();
}
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;
}
}
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;
}
}
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);
}
}
参考书籍:《大话设计模式》-程杰