MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。
定义:
将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。
使用场景:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的组装方式的情况
2.当构造过程必须允许被构造的对象有不同的表示时。
优缺点分析:
优点:
1.客户端不必知道产品内部组成的具体细节,讲产品本身与产品的创建过程进行解耦,使得相同的创建过程可以创建各种不同产品对象。
2.每一个具体建造者都是相对独立的,而与其他的具体建造者没有关系,因此可以很方便的去替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者,就可以得到不同的产品对象。
3.可以更加精细的控制产品的创建具体过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序对创建过程进行控制。
4.增加新的具体创建者不用修改原有类库的代码,指挥者类是针对抽象建造者类编程的,系统扩展方便,符合“开放-封闭”原则
缺点:
创建者模式比较符合产品差别不大的对象的创建,如果差别很大,就会导致非常多的具体的创建者,这时候最好结合工厂方法模式。
角色分析
Builder(抽象建造者):
是为创建一个Product对象的各个部件指定的抽象接口。
ConcreateBuilder(具体建造者):
实现Builder接口,构造和装配各个部件。
Director(指挥者):一方面它隔离了客户与生产过程,另一方面它负责控制产品的生产过程。
Product(产品):具体的产品
建造者模式结构图
基本代码分析
//具体的产品类
public class Product {
ArrayList<String> parts = new ArrayList<String>();
public void add(String part){
parts.add(part);
}
public void show(){
System.out.println("product show:");
for (int i = 0; i < parts.size(); i++) {
System.out.println(parts.get(i));
}
}
}
//抽象的建造者类
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
//具体的建造者类A
public class ConcreteBuilderA extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("BuilderA Part A");
}
@Override
public void buildPartB() {
product.add("BuilderA Part B");
}
@Override
public Product getResult() {
return product;
}
}
//具体的建造者类B
public class ConcreteBuilderB extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("BuilderB Part A");
}
@Override
public void buildPartB() {
product.add("BuilderB Part B");
}
@Override
public Product getResult() {
return product;
}
}
//指挥者类
public class Director {
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
客户端测试代码如下:
public class BuilderTest {
public static void main(String[] args) {
Director director = new Director();
Builder builderA = new ConcreteBuilderA();
Builder builderB = new ConcreteBuilderB();
// 指挥者建造A
director.construct(builderA);
Product productA = builderA.getResult();
productA.show();
// 指挥者建造B
director.construct(builderB);
Product productB = builderB.getResult();
productB.show();
}
}
测试结果如下:
product show:
BuilderA Part A
BuilderA Part B
product show:
BuilderB Part A
BuilderB Part B
BuilderA Part A
BuilderA Part B
product show:
BuilderB Part A
BuilderB Part B