1. 什么是建造者模式?
将一个复杂的的
与它的
分离,使同样的构建过程可以创建不同的表示。
如果我们用了建造者模式,那么用户只需指定需要建造类型就可以得到它们,而具体建造的过程和细节就不需要知道。

2. 什么时候用建造者模式?
它主要用于创建一些复杂的对象,这些对象的内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
3. 建造者模式的好处
使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

/**
* Product类:产品类,由多个部件组成
*/
class Product {
List<String> parts = new ArrayList();
public void add(String part) {
parts.add(part);
}
public void show() {
System.out.println("\n 产品 创建 -----");
for (String part : parts) {
System.out.println(part);
}
}
}
/**
* 抽象建造者类:确定产品由2个部件partA 和 partB组成,并声明一个得到产品建造后结果的方法:getResult
*/
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
/**
* 具体建造者类
*/
class Builder1 extends 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;
}
}
/**
* 具体建造者类
*/
class Builder2 extends 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;
}
}
/**
* 指挥者类
*/
class Director {
/**
* 用来指挥建造过程
*/
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
class Client {
public static void main(String[] args) {
//指挥者,指挥构建过程
Director director = new Director();
//1. 建造者只关心建造的细节和实现
Builder builder1 = new Builder1();
//2. 将建造过程的统筹 抽离 给指挥者来干
director.construct(builder1);
//3. 建造者本身返回一个建造结果
Product p1 = builder1.getResult();
//4. 建造结果的展示
p1.show();
//更换新的建造者
Builder builder2 = new Builder2();
director.construct(builder2);
Product p2 = builder1.getResult();
p2.show();
}
}
网友评论