设计模式系列之--建造者模式

本文深入解析建造者模式,一种创建型设计模式,用于构建复杂对象的过程。通过对比工厂模式,阐述了建造者模式注重过程而非结果的特点。文章通过造房子的例子,展示了如何使用建造者模式和指挥者模式来标准化生产流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型模式

这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。
建造者模式与工厂模式很像 他们的区别是:
建造者模式注重过程
工厂模式注重结果
建造者模式也是一种生产一类对象的模式 但是这一类对象要求生产过程或流程统一 工厂模式只提供了创建的方法具体创建方式由子工厂自己决定 而建造者模式提供了建造的基本流程(标准) 那么子工厂需要按照这些流程来生产(父类只提供基本流程详细步骤还是要子类自己实现) 但是父类是没有办法控制流程的顺序的(流程的顺序是一样的) 若都让子类来控制流程就会造成数据的冗余(因为流程一样 每多一个子类 就多写一份流程) 也更不能让用户来执行流程这样不符合迪米特法则也不符合建造者模式的初衷 所以我们创建一个类来指挥流程的顺序(指挥者)
指挥者 通过聚合一个builder(父类) 来按照顺序调用父类规定的流程 调用完成后返回 建造完成的对象 (指挥者不关心子类是如何实现的他只需要保证流程的顺序即可)
用户也不需要关心流程是什么样的只要能拿到对象就可以了
用户只需要将子类放入指挥者 然后指挥者返回生产好的对象就可以了 若仍然希望只放入标识符就可以生产一个类 可以在建造者模式外层套一层工厂模式即可

以造房子为例
//建造模板(builder的父类)
public abstract class HouseBuilder {

    House house = new House();

    abstract void buildBasic();

    abstract void buildWalls();

    abstract void roofed();

    public House build(){
        return null;
    }

    House build(String housetype){
        house.setBasic(housetype + "Basic");
        house.setWall(housetype + "Wall");
        house.setRoofed(housetype + "Roof");
        return house;
    }
}

//房子建造流程交给指挥者
class HouseDirector{
    private HouseBuilder houseBuilder;

    public HouseBuilder getHouseBuilder() {
        return houseBuilder;
    }

    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }
    public HouseDirector(){}

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        return houseBuilder.build();
    }
}


//具体实现的子类
class CommonHouse extends HouseBuilder {

    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("普通房子砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("普通房子建屋顶");
    }

    @Override
    public House build(){
        return build("common");
    }

    @Override
    House build(String housetype) {
        return super.build(housetype);
    }
}
//具体实现的子类
class HighHouse extends HouseBuilder {

    @Override
    public void buildBasic() {
        System.out.println("高楼打地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("高楼砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("高楼建屋顶");
    }

    @Override
    public House build(){
        return build("high");
    }

    @Override
    House build(String housetype) {
        return super.build(housetype);
    }
}

//目标类
class House{
    private String basic;
    private String wall;
    private String roofed;


    public String getBasic() {
        return basic;
    }

    public void setBasic(String basic) {
        this.basic = basic;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getRoofed() {
        return roofed;
    }

    public void setRoofed(String roofed) {
        this.roofed = roofed;
    }

    @Override
    public String toString() {
        return "House{" +
                "basic='" + basic + '\'' +
                ", wall='" + wall + '\'' +
                ", roofed='" + roofed + '\'' +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值