在纸上画两个人,初步代码:
public class Main {
public static void main(String[] args) {
//画一个男孩
System.out.println("small-body");
System.out.println("small-head");
System.out.println("small-hand");
System.out.println("small-led");
//画一个成人
System.out.println("big-body");
System.out.println("big-head");
System.out.println("big-hand");
System.out.println("big-led");
}
}
缺点:太过依赖于细节,如果某个步骤缺少了(比如缺少了一条腿),那么画不出完整的人,不符合依赖倒转原则:应该依赖于抽象
改良后的代码:
public class Main {
public static void main(String[] args) {
BoyBuilder boyBuilder = new BoyBuilder();
ManBuilder manBuilder = new ManBuilder();
boyBuilder.build();
manBuilder.build();
}
}
class BoyBuilder {
public void build(){
System.out.println("small-body");
System.out.println("small-head");
System.out.println("small-hand");
System.out.println("small-led");
}
}
class ManBuilder {
public void build(){
System.out.println("big-body");
System.out.println("big-head");
System.out.println("big-hand");
System.out.println("big-led");
}
}
上面代码把人的构建步骤封装,但这还是不能杜绝编写封装类时漏某个步骤的危险,所以,最好的方法是写一个规定:凡是画人,都必须有头、身、手、脚,可以采用建造者模式:
public class Main {
public static void main(String[] args) {
Director director = new Director(new BoyBuilder());
director.createPerson();
}
}
//抽象出来的接口,用于规范实现它的建造器必须实现的步骤,这样即使写漏额步骤,编译器也不给编译通过的
interface PersonBuilder {
void buildHead();
void buildBody();
void buildLed();
void buildHand();
}
class BoyBuilder implements PersonBuilder{
@Override
public void buildHead() {
System.out.println("small-head");
}
@Override
public void buildBody() {
System.out.println("small-body");
}
@Override
public void buildLed() {
System.out.println("small-led");
}
@Override
public void buildHand() {
System.out.println("small-hand");
}
}
class ManBuilder implements PersonBuilder{
@Override
public void buildHead() {
System.out.println("big-head");
}
@Override
public void buildBody() {
System.out.println("big-body");
}
@Override
public void buildLed() {
System.out.println("big-led");
}
@Override
public void buildHand() {
System.out.println("big-hand");
}
}
//指挥者类,用于控制整个建造过程,也用来隔离用户与建造过程之间的关联
class Director {
private PersonBuilder personBuilder;
public Director(PersonBuilder personBuilder) {
this.personBuilder = personBuilder;
}
public void createPerson(){
personBuilder.buildBody();
personBuilder.buildHand();
personBuilder.buildHead();
personBuilder.buildLed();
}
}