美文网首页
05.设计模式-建造者模式

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

作者: 任振铭 | 来源:发表于2018-04-17 08:41 被阅读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;
        }
    }
    

    相关文章

      网友评论

          本文标题:05.设计模式-建造者模式

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