美文网首页
建造者模式

建造者模式

作者: 桃子爸比 | 来源:发表于2018-05-19 22:15 被阅读5次

    1.定义:将一个复杂的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

    2.角色:

            2.1 抽象建造者:给出一个抽象接口,定义了各个工人所需要进行的工作,这些工作是为了完成对房子的创建,就像工地会有指导手册一样。

            2.2 具体建造者:具体的建造者(农民工)去建房子,房子造完后需要将房子交付给房屋主人,所以需要返回房子的方法

            2.3 设计者(指导者):他知道房子怎么设计,他会指挥工人去建造(换做程序代码中,他也肯定会持有工人的这个对象的引用,所以他肯定对工人所具备的能力和行为有很深的了解)从整体角度出发,什么样的房子都能建成,他所具备的功能可以覆盖你所有的需求,哪怕业主提出的需求很简单,但是他所具备的能力必须全部覆盖

            2.4.产品(房子):房子会有哪些属性

    3.使用场景:复杂的对象,不同的表示方法

    传统使用方式:

    /**

    * 抽象建造者(建造者角色)

    * 工人接口,定义了各个工人所需要进行的工作

    * 并不负责具体的建造

    * 同时房子是具体的(农民工)建造的  所以需要有返回房子的方法

    */

    public interface Build {

        public void makeWindow();

        public void  makeFloor();

        public Room getRoom();

    }

    //具体建造者(包工头)

    public class WorkBuilder implements Build{

        private Room room=new Room();

        @Override

        public void makeWindow() {

            room.setFloor("地板  ");

        }

        @Override

        public void makeFloor() {

            room.setWindow("窗户");

        }

        @Override

        public Room getRoom() {

            return room;

        }

    }

    /**

    * 设计者(指导者 角色)

    * 所具备的能力

    *

    * 设计师  他知道房子怎么设计

    * 他会指挥工人去建造

    * 实际生活中  大厦的设计者并不会看大厦的具体实现细节

    * 更多的是从整体角度出发,指挥这个工人团队建造

    * 所以他肯定对工人所具备的能力和行为有很深的了解

    * 换做程序代码中 ,他也肯定会持有工人 的这个对象的引用

    */

    public class Designer {

        public void order(Build build){

            build.makeFloor();

            build.makeWindow();

        }

    }

    /**

    * 房子类 

    * 首先要描述下 房子要有些什么

    * 有哪些属性

    */

    public class Room {

        private String window;

        private String floor;

        public String getWindow() {

        return window;

        }

        public void setWindow(String window) {

            this.window = window;

        }

        public String getFloor() {

            return floor;

        }

        public void setFloor(String floor) {

            this.floor = floor;

        }

        @Override

        public String toString() {

        // TODO Auto-generated method stub

            return "---->floor  "+floor+"  window  "+window;

        }

    }

    //客户具体调用

    public class Client {

       public static void main(String[] args) {   

           Build worker = new WorkBuilder(); //获取工人对象 

           Designer  designer = new  Designer();  //获取设计师对象

           designer.order(worker);    //设计师指挥工人工作

           System.out.println(worker.getRoom());;  //工人交房

        } 

    }

    项目中的使用方式:

    会将房子参数配置以内部类的形式写在建造者里面

    public class WorkBuilder{

    private RoomParmas parmas;

    public WorkBuilder( ) {

    this.parmas = new RoomParmas();

    }

    public  WorkBuilder makeWindow(String window ) {

    parmas.window=window;

    return this;

    }

    public WorkBuilder makeFloor(String floorCorlor) {

    parmas.floor=floorCorlor;

    return this;

    }

    public WorkBuilder makeDoor(String door) {

    parmas.door=door;

    return this;

    }

    public Room makeChat(String  chat) {

    parmas.chat=chat;

    Room room=new Room();

    return room;

    }

    public  void show()

    {

    }

    public Room build() {

    Room room=new Room();

    room.apply(parmas);

    return room;

    }

    class RoomParmas

    {

    public  String window;

    public String floor;

    public String door;

    public String  chat;

    }

    }

    而调用方式采用 链式调用,可以参考AlertDialog源码

    public class Client {

      public static void main(String[] args) {   

             Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").makeChat("").show();; //获取工人对象 

             System.out.println(room);;  //工人交房

          } 

    }

    总结:1.参数配置为内部类形式

               2.使用者调用采用链式调用方式,参数可配置化

    相关文章

      网友评论

          本文标题:建造者模式

          本文链接:https://www.haomeiwen.com/subject/bouadftx.html