1.定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
- 使用建造者模式,用户只需指定需要建造的类型就可以得到他们,而具体的建造过程和细节就不需知道了
2.应用场景
让建造过程固定,建造细节可变、所以定义抽象类,固定建造过程。
让具体类去继承抽象类,实现具体类的建造需求。
指挥者指导对象的建造过程,根据用户的选择一步一步构建,隔离用户和建造过程的关联。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hu6zlE0n-1620538693623)(image-20210509110716725.png)]
-
主要用于创建一些复杂的对象,这些对象的内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
当创建复杂对象的算法(指挥者)应该独立于该对象的组成部分(具体类)以及他们的装配方式(父类)时适用。
-
好处: 使得建造代码与表示代码分离,因为建造者模式隐藏了产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就好了。
3.助理解代码
3.1产品类,由多个部件组成
package com.builder;
import java.util.ArrayList;
import java.util.List;
public class Product {
//产品类,由多个部件构成
List<String> parts=new ArrayList<String>();
//添加部件
public void add(String part){
parts.add(part);
}
//列举所以的部件
public void show(){
System.out.println("产品创建中....");
for (String s:parts){
System.out.println(s);
}
}
}
3.2 Builer类,抽象建造者,确定产品由几个部件构成,并且声明得到产品建造后结果的方法
package com.builder;
//抽象建造者类: 确定产品由哪些部件组成,并且声明一个得到产品建造后结果的方法
public abstract class Builder {
public abstract void BuilderPartA();
public abstract void BuilderPartB();
public abstract Product Getresult();
}
3.3 具体建造者类1
package com.builder;
//具体建造者类
public class ConcreteBuilder1 extends Builder{
private Product product=new Product();
@Override
public void BuilderPartA() {
product.add("部件A");
}
@Override
public void BuilderPartB() {
product.add("部件B");
}
@Override
public Product Getresult() {
return product;
}
}
3.4具体建造者类2
package com.builder;
public class ConcreteBuilder2 extends Builder{
private Product product=new Product();
@Override
public void BuilderPartA() {
product.add("部件X");
}
@Override
public void BuilderPartB() {
product.add("部件Y");
}
@Override
public Product Getresult() {
return product;
}
}
3.5指挥者类
package com.builder;
//指挥者类
public class Director {
public void Construct(Builder builder){
builder.BuilderPartA();
builder.BuilderPartB();
}
}
3.6客户端类
package com.builder;
//客户端不需知道具体的建造过程
public class Client {
public static void main(String[] args) {
Director director=new Director();
Builder b1=new ConcreteBuilder1();
Builder b2=new ConcreteBuilder2();
director.Construct(b1);
Product p1=b1.Getresult();
p1.show();
director.Construct(b2);
Product p2=b2.Getresult();
p2.show();
}
}
3.6 运行结果
产品创建中....
部件A
部件B
产品创建中....
部件X
部件Y