Java建造者模式
什么是建造者模式:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式优点:
- 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,相同的建造过程可以创建不同的产品对象
- 使用的不同的具体建造者就可以得到不同的产品对象,具体建造者之间相互独立
- 可以更加惊喜的控制产品的创建过程
- 增加新的具体建造者无需修改原有的类库代码,指挥者类针对抽象建造者类编程,符合“开闭原则”
在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
例子:比喻我们构建一个人类
public class Human {
private String head; //头部
private String body; //身体
private String hand; //手
private String foot; //脚
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getHand() {
return hand;
}
public void setHand(String hand) {
this.hand = hand;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
接口:一个定义了造人标准的接口
/* 看,一个接口定义好了。有各种造部位的方法,最后给个createHuman方法给你返回一个我们想要造的人。 现在,人的类和造人的标准我们都定义好了。那我们可以先造一个人出来,先造一个高智商的人吧。 */ //一个接口。一个定义了造人标准的接口。 public interface IBuildHuman { public void buildHead(); public void buildBody(); public void buildHand(); public void buildFoot(); public Human createHuman(); }
看,一个接口定义好了。有各种造部位的方法,最后给个createHuman方法给你返回一个我们想要造的人。
现在,人的类和造人的标准我们都定义好了。那我们可以先造一个人出来,先造一个高智商的人吧。
//实现接口
/* 这个高智商的造人过程自然是实现了IBuildHuman这个造人标准的接口了。然后就是set方法,最后返回造好的human。 */ public class SmartManBuilder implements IBuildHuman { Human human; public SmartManBuilder() { human = new Human(); } @Override public void buildHead() { human.setHead("智商180的头脑"); } @Override public void buildBody() { human.setBody("新的身体"); } @Override public void buildHand() { human.setHand("新的手"); } @Override public void buildFoot() { human.setFoot("新的脚"); } @Override public Human createHuman() { return human; } }
这个高智商的造人过程自然是实现了IBuildHuman这个造人标准的接口了。然后就是set方法,最后返回造好的human。
创建一个director类
/* 好的,其实到这里呢,我们已经完成了建造的过程。那就这么简单的建造过程,还搞了一个建造模式吗?非也。 接下来,就是介绍建造者模式的精髓,那就是director。 这个director呢,就是来执行我们刚才的造人动作的。没错,精髓就是我们刚才的造人动作。我们先看代码: */ public class Director { public Human createHumanByDirecotr(IBuildHuman bh){ bh.buildBody(); bh.buildFoot(); bh.buildHand(); bh.buildHead(); return bh.createHuman(); } }
//创建BuilderTest类
public class BuilderTest { public static void main(String[] args) {
Director director = new Director(); Human human =director.createHumanByDirecotr(new SmartManBuilder()); System.out.println(human.getBody()); System.out.println(human.getFoot()); System.out.println(human.getHand()); System.out.println(human.getHead()); }
}
结果: