05.设计模式-建造者模式

2018-04-17  本文已影响13人  任振铭
建造者模式.png

模式讲解:

  1. 设计者(Designer)和客户(Client)沟通明确需求
  2. 沟通后设计者将客户创建产品的需求划分为各个部件的建造请求(Builder)
  3. 将各个部件的建造请求委派到具体的建造者(WorkBuilder)
  4. 各个具体建造者负责进行产品部件的构建
  5. 最终构建成具体产品(Room)

抽象构建者

/**
 * 抽象建造者角色
 * 这是建造房子的通用功能,任何房子的构建过程都需要或者部分需要这些功能,只是具体的构建情况因房而异
 * 具体的建造者需要遵循这些建造规则,所以具体的构建者继承这个接口
 */
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.setWindow("窗户");
    }

    @Override
    public void makeFloor() {
        room.setFloor("地板");
    }

    @Override
    public Room getRoom() {
        return room;
    }

}

产品

/**
 * 房子类 这是要建造的产品 
 * 产品具有自己的属性,这也是建造者将要完成的工作就是给这些属性赋值
 */
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 Designer {
    
    public void order(Build build)
    {
        build.makeFloor();
        build.makeWindow();
    }
}

开始构建

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());;   //工人交房 
      }  
}

上边是一种标准的建造者模式,但是一般在开发中我们不会按照这种方式来构建代码,接下来进行第一次重构

第一次重构

将抽象建造者和设计师角色去掉,在具体的建造者中增加一个RoomParmas用于存储Room每个属性,上一种写法是相当于得到一个材料之后就将对应的部件构建出来,而这次我们先获取到所有的材料,等材料齐全,一次性构建出产品,所有的材料都存储在RoomParmas中

重构后的具体构建者

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;
    }
    /**
     *构建时把参数传递到Room中
     */
    public Room build() {
        Room room=new Room();
        room.apply(parmas);
        return room;
    }
    
    /**
     *这个内部类存储的属性和Room产品保持一致
     */
    class RoomParmas {
        public  String window;  
        public String floor;
        public String door;
    }

}

产品类

public class Room {
    private String window;  
    private String floor;
    private String doorl;
    
    @Override
    public String toString() {
        return "---->floor  "+floor+"   window   "+window;
    }
    
    /**
     * 这个方法用于接收构建者传递的参数
     * @param parmas
     */
    public void apply(RoomParmas parmas) {
        window=parmas.window;
        floor=parmas.floor;
        doorl=parmas.door;
    }
}

开始构建

public class Client {
      public static void main(String[] args) {    
             Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").build(); //获取产品对象
             System.out.println(room);;   //工人交房 
      }  
}

第二次重构

我们看到,第一次重构的结果中,具体的构建者何产品类还相互独立,但是一般开发中我们为了简化代码结构,可以将具体的构建者设置到产品类中作为一个内部类来实现,可以看的出来,这种结构已经非常类似android中的AlertDialog了,这就是我们最终的结果

Room:

public class Room {
    private String window;  
    private String floor;
    private String doorl;
    
    @Override
    public String toString() {
        return "---->floor  "+floor+"   window   "+window;
    }
    
    public static 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 build() {
            Room room=new Room();
            room.apply(parmas);
            return room;
        }
        
        
        static class RoomParmas {
            public  String window;  
            public String floor;
            public String door;
        }

    }
    
    /**
     * 这个方法用于接收构建者传递的参数
     * @param parmas
     */
    public void apply(RoomParmas parmas) {
        window=parmas.window;
        floor=parmas.floor;
        doorl=parmas.door;
    }
}
上一篇下一篇

猜你喜欢

热点阅读