设计模式_9:建造者模式

在纸上画两个人,初步代码:

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();
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值