建造者模式
当我们需要将一个复杂的对象的构建与他的表示分离,使用相同的构造过程来创建不同的表示的时候,我们就需要使用建造者模式了。
结构图
例子:大话设计模式中的,例子。大鸟让小菜创建一个小人,拥有头,身体,左右手,左右腿。因为人都拥有头,身体,左右手和左右腿。这样,当需要构建出不同的人,例如一个瘦子,一个胖子,一个瘸腿的,他们的过程都是一样的,但是表达方式都不一样。
于是我们就可以将构建人的过程抽象成一个builder接口,对于需要创建不同的的人,只需要不同的builder来继承这个类。这样就可以保证说有的步骤,不会因为编码者的原因有任何的缺漏。
而且如果我们使用了建造者模式,那么用户就只需要指定建造的类型就可以得到他们,而建造的过程和细节就不需要知道了。
建造者模式的步骤
1、首先需要将构造过程抽象出来形成一个接口,将构建头,手,身体等写成抽象方发。
2、在builder接口中创建一个builder的类,来产生创建的product也就是“人”。
3、创建一个建造者,来传入具体的需要建造的产品,来进行建造。
一个简单的例子
首先创建一个PsersonBuilder
/**
* 抽象出需要建造的过程,需要建造手,头,脚,身体
* Created by zero on 2017/3/31.
*/
public interface PersonBuilder {
public void buildHead();
public void buildBody();
public void buildLleg();
public void buildRleg();
public void buildLhand();
public void buildRhand();
}
创建一个Builder,实现这个接口,来建造瘦人
同时我们可以创建不同的人,缺胳膊少腿的都可以。建造过程不变
public class PersonThinBuilder implements PersonBuilder {
@Override
public void buildHead() {
System.out.println("有头");
}
@Override
public void buildBody() {
System.out.println("身体小");
}
@Override
public void buildLleg() {
System.out.println("有左腿");
}
@Override
public void buildRleg() {
System.out.println("有右腿");
}
@Override
public void buildLhand() {
System.out.println("有左手");
}
@Override
public void buildRhand() {
System.out.println("有左手");
}
}
创建一个具体建造者来建造人
public class PersonDirector {
private PersonBuilder personBuilder;
public PersonDirector(PersonBuilder personBuilder) {
this.personBuilder = personBuilder;
}
/**
* 创建一个人,根据用户的选择
* @return
*/
public PersonBuilder creatPerson(){
personBuilder.buildBody();
personBuilder.buildHead();
personBuilder.buildLhand();
personBuilder.buildRhand();
personBuilder.buildLleg();
personBuilder.buildRleg();
return personBuilder;
}
}
客户端调用
public class App {
public static void main(String[] args) {
//需要创建一个瘦的人
PersonThinBuilder personThinBuilder = new PersonThinBuilder();
//创建建造者
PersonDirector personDirector = new PersonDirector(personThinBuilder);
//建造小人
personDirector.creatPerson();
}
}