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

来源:互联网 发布:苹果清除app缓存数据 编辑:程序博客网 时间:2024/06/04 19:45

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

0 0
原创粉丝点击