建造者模式:
将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不容的表示
类图的来源如下:
https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=654913270,1692471299&fm=26&gp=0.jpg
其中:
Builder:是为创建一个Product对象的各个部件制定的抽象接口
ConcreteBuilder:是具体的建造者,实现Builder接口,构建和装配各个部件。
Product是具体的产品角色(建造的各个过程是稳定的)
Director:是指挥者,构建一个使用Builder结构的对象
建造者模式的应用情况:
public class Product {
List<String> parts=new ArrayList<>();
/**
* 添加产品部件
* @param part
*/
public void Add(String part)
{
parts.add(part);
}
public void show()
{
System.out.println("具体的产品部件列表");
ListIterator list=parts.listIterator();
while(list.hasNext())
{
System.out.println(list.next());
}
}
}
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
public class ConcreteBuilder1 extends Builder {
private Product product=new Product();
@Override
public void buildPartA() {
System.out.println("部件A");
}
@Override
public void buildPartB() {
System.out.println("部件B");
}
@Override
public Product getResult() {
return product;
}
}
public class ConcreteBuilder2 extends Builder{
private Product product=new Product();
@Override
public void buildPartA() {
System.out.println("部件X");
}
@Override
public void buildPartB() {
System.out.println("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
public class Director {
//用来只会建造过程
public void Construct(Builder builder)
{
builder.buildPartA();
builder.buildPartB();
}
}
public class Main {
public static void main(String[] args) {
Director director=new Director();
Builder b1=new ConcreteBuilder1();
Builder b2=new ConcreteBuilder2();
//指挥者用ConcreteBuilder1的方法来创建产品
director.Construct(b1);
Product p1=b1.getResult();
p1.show();
director.Construct(b2);
Product p2=b2.getResult();
p2.show();
}
}
当创建复杂对象的算法应该独立于该对象的组成部分以及他们的转配时使用的模式