定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构图

-
director:指挥者。由指挥者根据需求决定调用哪个建造者生产哪种产品。
-
builder:建造者接口。定义了建造一个产品所必须的所有流程。所有的建造者都需要实现该类,以确保实现建造一个产品所需的流程。
-
concreteBuilder:具体建造者。每一个建造者,可以创建一种产品,产品细节在建造者中定义,因此多个产品对应多个建造者。
-
product:具体产品。
使用场景
-
主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
-
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。
-
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适应的模式。
画小人的例子
这个是炒饭的例子,非常不错,可以看看
《大话设计模式》——建造者模式
- 结构图

这张图缺少了产品Product本身的依赖项,这里就是Person。只是原文中这个例子的Person(Product)是一幅画,所以没有用类来表示。
- Person类(Product):这里用一个类,用文字描述表示画的人
class Person {
private String head = "头";
private String body = "身体";
private String armLeft = "左手";
private String armRight = "右手";
private String legLeft = "左脚";
private String legRight = "右脚";
// set函数
public void setHead(String head) {
this.head = head;
}
public void setBody(String body) {
this.body = body;
}
public void setArmLeft(String armLeft) {
this.armLeft = armLeft;
}
public void setArmRight(String armRight) {
this.armRight = armRight;
}
public void setLegLeft(String legLeft) {
this.legLeft = legLeft;
}
public void setLegRight(String legRight) {
this.legRight = legRight;
}
// 展示
public String show() {
String info = head + "\n"
+ body + "\n"
+ armLeft + "\n"
+ armRight + "\n"
+ legLeft + "\n"
+ legRight + "\n";
Log.v("Person", info);
return info;
}
}
- PersonBuilder类(Builder):定义各个制造过程,获取产品等方法。可以是抽象基类,也可以是接口
abstract class PersonBuilder {
protected Person person = new Person();
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildArmLeft();
public abstract void buildArmRight();
public abstract void buildLegLeft();
public abstract void buildLegRight();
public Person getPerson() {
return person;
}
}
- PersonThinBuilder、PersonFatBuilder类(ConcreteBuilder):具体的制造类,这里需要定义具体的建造细节。
class PersonThinBuilder extends PersonBuilder {
@Override
public void buildHead() {
person.setHead("瘦子的头");
}
@Override
public void buildBody() {
person.setBody("瘦子的身体");
}
@Override
public void buildArmLeft() {
person.setArmLeft("瘦子的左手");
}
@Override
public void buildArmRight() {
person.setArmRight("瘦子的右手");
}
@Override
public void buildLegLeft() {
person.setLegLeft("瘦子的左脚");
}
@Override
public void buildLegRight() {
person.setLegRight("瘦子的右脚");
}
}
class PersonFatBuilder extends PersonBuilder {
@Override
public void buildHead() {
person.setHead("胖子的头");
}
@Override
public void buildBody() {
person.setBody("胖子的身体");
}
@Override
public void buildArmLeft() {
person.setArmLeft("胖子的左手");
}
@Override
public void buildArmRight() {
person.setArmRight("胖子的右手");
}
@Override
public void buildLegLeft() {
person.setLegLeft("胖子的左脚");
}
@Override
public void buildLegRight() {
person.setLegRight("胖子的右脚");
}
}
- PersonDirector类(Director):指挥者,将各个建造步骤组合成固定的建造流程,并调用具体的建造者完成产品建造。
class PersonDirector {
public void createPerson(PersonBuilder personBuilder) {
personBuilder.buildHead();
personBuilder.buildBody();
personBuilder.buildArmLeft();
personBuilder.buildArmRight();
personBuilder.buildLegLeft();
personBuilder.buildLegRight();
}
}
- 测试界面

- 客户端代码
public class BuilderActivity extends AppCompatActivity {
public static void launch(Context context) {
if (null != context) {
Intent intent = new Intent();
intent.setClass(context, BuilderActivity.class);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}
TextView infoTextView;
Person thinPerson, fatPerson;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_builder);
setTitle("建造者模式");
infoTextView = findViewById(R.id.textViewInfo);
PersonDirector director = new PersonDirector();
// 画瘦子
PersonThinBuilder thinBuilder = new PersonThinBuilder();
director.createPerson(thinBuilder);
thinPerson = thinBuilder.getPerson();
// 画胖子
PersonFatBuilder fatBuilder = new PersonFatBuilder();
director.createPerson(fatBuilder);
fatPerson = fatBuilder.getPerson();
}
public void onThinClick(View view) {
infoTextView.setText(thinPerson.show());
}
public void onFatClick(View view) {
infoTextView.setText(fatPerson.show());
}
}
Demo地址
https://gitee.com/zhangxusong888/Android/tree/master/design_pattern
网友评论