介绍:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
场景:我们在创建对象时可能会碰到过一个问题,比如,如果需要赋值的属性过多,构造函数会很多,而且有的会很长。通过JavaBean的方式可能不需要担心构造函数,但是,我们的set部分又会很长很难看,这里推荐大家试试builder模式
角色 | 作用 |
---|---|
产品(Product) | 目标创建的复杂对象 |
抽象生成器(Builder) | 提供创建一个Product对象的各个组件的方法及返回Product对象的方法 |
具体生成器(ConcreteBuilder) | 实现Buidler接口的类。 |
管理者(Director) | 用于管理builder对象的工作 |
玩过《我的世界》这类沙盒游戏的玩家,很多都是冲着其开放式的制作功能去的。比如,我们要建造一个房子就需要以下:墙,屋顶,门,床。但是这些东西的制作也十分麻烦。如果每次都让客户端来创建会需要很多代码
内部组件
// 床
public class Bed {
public Bed(String s) {
System.out.println(s);
}
}
// 门
public class Door {
public Door(String s) {
System.out.println(s);
}
}
// 屋顶
public class Roof {
public Roof(String s) {
System.out.println(s);
}
}
// 墙
public class Wall {
public Wall(String s) {
System.out.println(s);
}
}
public class House {
public Bed bed;
public Door door;
public Roof roof;
public Wall wall;
public House(Bed bed){
this.bed = bed;
}
public House(Bed bed,Door door){
this.bed = bed;
this.door = door;
}
// ......省略各种组合的构造函数
}
可见,这种方式会使此类中存在很多构造方法,而且不能满足所有的组合,客户端在制作房屋的时候,比较不适用。
public class House {
public Bed bed;
public Door door;
public Roof roof;
public Wall wall;
// setter and getter
}
典型的java bean 的形式,解决上面构造函数的不足,但是让我们来看看使用。
House house = new House();
house.setBed(1);// ......省略其它set方法
如果我们的私有属性增加到二十,那么我们每次创建的时候就需要写二十行setter代码,上面这两种方法,在每次创建房屋的时候,客户端还需要每次去创建各种类型的对象,会产生很多重复代码。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54