设计模式->创建型模式->建造者模式

1.定义:将一个复杂对象的创建和表示分离,是相同的构建过程产生构建出不同的表示。该模式倾向于流程抽象

2.UML


3.理论基础:继承,抽象

4.涉及角色:

        抽象构建者:定义了构建某类抽象产品的具体流程。属于流程的抽象。因为产品是按照流程逐步构建的所以需要提供获得产品的访问点。总结作用主要有1.定义产品构建流程。2.提供获得产品访问点

       具体构建者:抽象构建者的子类,针对于某个具体产品的构建流程

指挥者:不管是采用属性还是api参数的形式,该类都会持有抽象建造者的实例。采用多态的方式完成产品的构建。在指挥者中规定了产品的构建流程。产品的构建就是在指挥者中完成的

抽象产品:抽象产品,客户端通过访问点获得产品为抽象产品类型

具体产品:抽象产品的子类

5.优点

        1.建造代码和表示代码分离

2.建造者隐藏了产品的组装流程。客户端不需要关注产品的组装过程,只需要消费对象

3.方便扩展。遵守开闭原则。如果产品的内部表示发生变化,只需要再定义一个具体的构建者

4.具体建造者相互对立,也就是说可以在具体的建造者中进行流程的细化

5.流程固定,具体细节可以延迟到子类

6.缺点

       1. 由于建造社属于流程抽象,需要对流程抽象。抽象流程将是难点。如果流程抽象的不具有一般性或者通用性。后续对流程的修改回比较麻烦

7.使用场景

1.创建复杂对象,对象的内部组成的建造顺序是稳定的,但是具体到某个对象的内部组成面临者复杂的变化

2.创建过程独立于对象的组成也独立于组成部分的装配

8. Code

流程抽象IBuilder

public interface IBuyHouse {
    //选择楼盘
    public void choiceBuilding();
    //在给定的楼盘中选择价格
    public void choicePrice();
    //砍价
    public int bargain();
    //交首付
    public int payments();
    //签合同
    public void signContract();
    //验收
    public boolean checkHouse();
    //获得房子
    public IHouse getHouse();

}

//具体建造者

public class BuyHDHouse implements IBuyHouse {
    //具体产品,在该建造者中实现该产品的组装
    private HDHouse hdHouse = new HDHouse();

    @Override
    public void choiceBuilding() {
        //TODO 完成具体产品的部分组装
        System.out.println("选择HD楼盘");
    }

    @Override
    public void choicePrice() {
        //TODO 完成具体产品的部分组装
        System.out.println("预售价格: 9500");
    }

    @Override
    public int bargain() {
        //TODO 完成具体产品的部分组装
        System.out.println("成交价格: 9000");
        return 9000;
    }

    @Override
    public int payments() {
        //TODO 完成具体产品的部分组装
        System.out.println("首付款: 22W");
        return 220000;
    }

    @Override
    public void signContract() {
        //TODO 完成具体产品的部分组装
        System.out.println("和建行签合同");
    }

    @Override
    public boolean checkHouse() {
        //TODO 完成具体产品的部分组装
        System.out.println("验收房子:通过");
        return true;
    }

    @Override
    public IHouse getHouse() {
        //完成组装后获得产品
        return hdHouse;
    }
}

public class BuyWKHouse implements IBuyHouse {

    //具体产品,在该建造者中实现该产品的组装
    private WKHouse wkHouse = new WKHouse();

    @Override
    public void choiceBuilding() {
        //TODO 完成具体产品的部分组装
        System.out.println("选择WK楼盘");
    }

    @Override
    public void choicePrice() {
        //TODO 完成具体产品的部分组装
        System.out.println("预售价格: 11000");
    }

    @Override
    public int bargain() {
        //TODO 完成具体产品的部分组装
        System.out.println("成交价格: 10000");
        return 9000;
    }

    @Override
    public int payments() {
        //TODO 完成具体产品的部分组装
        System.out.println("首付款: 30W");
        return 300000;
    }

    @Override
    public void signContract() {
        //TODO 完成具体产品的部分组装
        System.out.println("和招商签合同");
    }

    @Override
    public boolean checkHouse() {
        //TODO 完成具体产品的部分组装
        System.out.println("验收房子:不通过");
        return true;
    }

    @Override
    public IHouse getHouse() {
        //完成组装后获得产品
        return wkHouse;
    }
}



//指挥者

public class Director {
    public void buyHouse(List<IBuyHouse> buyHouses) {
        for (IBuyHouse buyHouse : buyHouses) {
            buyHouse.choiceBuilding();
            buyHouse.choicePrice();
            buyHouse.bargain();
            buyHouse.payments();
            buyHouse.signContract();
            buyHouse.checkHouse();
            System.out.println("流程结束,获得房子");
            System.out.println();
        }
    }
}

//抽象产品

public abstract class IHouse {
}

//具体产品

public class HDHouse extends IHouse {
    //TODO 实现逻辑
}


public class WKHouse extends IHouse {
    //TODO 实现逻辑
}


//客户端

public class Client {
    public static void main(String[] args) {
        List<IBuyHouse> list = new ArrayList<IBuyHouse>();
        IBuyHouse hdHouse = new BuyHDHouse();
        IBuyHouse wkHouse = new BuyWKHouse();
        list.add(hdHouse);
        list.add(wkHouse);

        Director director = new Director();
        director.buyHouse(list);

        System.out.println("get house: " + hdHouse.getHouse());
        System.out.println("get house: " + wkHouse.getHouse());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值