《设计模式》第三章——Builder模式

来源:互联网 发布:宁波seo教程 编辑:程序博客网 时间:2024/05/17 19:59
一、典型的应用场景
有几个不同的产品,它们由各自需要的部件组成,它们使用这些部件构造最终产品的接口是一致的,那么可以把这些一致的接口提炼出来
注意,在Builder模式中,对于不同的产品,没有需要共同的产品父类的限制,对于它们的组成部件也没有需要共同的部件父类的限制
如果需要得到最终的产品,得经过类型判断,得到具体的Builder类,然后再得到最终的产品


二、结构图




三、优缺点
将“构造过程”和“产品、部件的内部表示和装配过程”分开,客户不需要知道定义产品内部结构的所有类的信息


四、代码实例

package designPattern;interface Builder {    void buildHead();    void buildBody();}class HumanBuilder implements Builder {    Human human;    public HumanBuilder() {        human = new Human();    }    public void buildHead() {        Head head = new Head();        human.setHead(head);    }    public void buildBody() {        Body body = new Body();        human.setBody(body);    }    public Human getHuman() {        return human;    }    static class Human {        Head head;        Body body;        public void setHead(Head head) {            this.head = head;        }        public void setBody(Body body) {            this.body = body;        }        public String toString() {            return "I am a human " + this.head.toString() + " " + this.body.toString();        }    }    static class Head {        public String toString() {            return "I am a Head";        }    }    static class Body {        public String toString() {            return "I am a Body";        }    }}class ComputerBuilder implements Builder {    Computer computer;    public ComputerBuilder() {        computer = new Computer();    }    public void buildHead() {        CPU cpu = new CPU();        computer.setCPU(cpu);    }    public void buildBody() {        MainBoard mainBoard = new MainBoard();        computer.setMainBoard(mainBoard);    }    public Computer getComputer() {        return computer;    }        static class Computer {        CPU cpu;        MainBoard mainBoard;        public void setCPU(CPU cpu) {            this.cpu = cpu;        }        public void setMainBoard(MainBoard mainBoard) {            this.mainBoard = mainBoard;        }        public String toString() {            return "I am a computer " + this.cpu.toString() + " " + this.mainBoard.toString();        }    }    static class CPU {        public String toString() {            return "I am a CPU";        }    }    static class MainBoard {        public String toString() {            return "I am a MainBoard";        }    }}public class BuilderExample {    public static void main(String[] args) {        HumanBuilder humanBuilder = new HumanBuilder();        execute(humanBuilder);        System.out.println(humanBuilder.getHuman());        ComputerBuilder computerBuilder = new ComputerBuilder();        execute(computerBuilder);        System.out.println(computerBuilder.getComputer());    }    public static void execute(Builder builder) {        builder.buildHead();        builder.buildBody();    }}


备注:

1)在书中的构造迷宫的例子中,MazeBuilder中的GetMaze()接口其实是不需要的,Builder模式的返回产品的接口都是在具体Builder类中定义的,无需在抽象Builder类中定义,因为不同的具体Builder类返回的产品可以完全不同,而没有共同的产品父类,因此在抽象Builder类中定义返回产品的接口是实现不了的



2)Builder模式跟用产品的构造方法来构造产品的方式的一点区别:用构造方法构造产品,那么使用哪些部件都是写死的;而用Builder模式可以自己决定使用哪些部件,部件的数量等等


3)Abstract Factory模式和Builder模式:Abstract Factory模式着重于多个系列的产品,Builder模式着重于一步步构造一个对象
0 0
原创粉丝点击