• 第七讲:建造者模式


     

    Product:House

    Builder:HouseBuilder(工程队)

    ConcreteBuilder:PingFangBuilder、GongyuBuilder

    Director:组合的模式,包含Builder,包含工程队,由Director来指使工程队做事.组合不是聚合,Director包含了Builder.

    construct()是建造方法,不是构造函数.就是Director的makeHouse()方法.

    演变的过程:自己做->工程队做->设计师做.

    客户端代码越来越少越来越简洁.


     

    工厂:GongyuBuidler、PingFangBuilder


    public class GongyuBuilder implements HouseBuilder{
        House house = new House();
        @Override
        public void makeFloor() {
            // TODO Auto-generated method stub
            house.setFloor("公寓-->地板");
        }
    
        @Override
        public void makeWall() {
            // TODO Auto-generated method stub
            house.setWall("公寓-->墙");
        }
    
        @Override
        public void makeHousetop() {
            // TODO Auto-generated method stub
            house.setHousetop("公寓-->房顶");
        }
    
        @Override
        public House getHouse() {
            // TODO Auto-generated method stub
            return house;
        }
         
    }
    /*
     * 房子
     * 
     */
    public class House {
          //地板
        private String floor;//复合属性可能是其它类的对象.这里做简单一些
          //
        private String wall;
          //屋顶
        private String housetop;
        public String getFloor() {
            return floor;
        }
        public void setFloor(String floor) {
            this.floor = floor;
        }
        public String getWall() {
            return wall;
        }
        public void setWall(String wall) {
            this.wall = wall;
        }
        public String getHousetop() {
            return housetop;
        }
        public void setHousetop(String housetop) {
            this.housetop = housetop;
        }
    
           
    
    }
    //工人有很多种.有些是修公寓的,有些是修其他的.
    /*
     *  工程队 
     */
    public interface HouseBuilder {
         //修地板
        public void makeFloor();
        // 修墙
        public void makeWall();
        //修屋顶
        public void makeHousetop();
        
        public House getHouse();
    }
    public class HouseDirector {
       //private HouseBuilder builder;
       
    /*public HouseDirector(HouseBuilder builder) {
        super();
        this.builder = builder;
    }*/
       //有些书籍不在HouseDirector的构造函数中传递buidler(工程队)的引用
    //public void makeHouse(){
        public void makeHouse(HouseBuilder builder){//第二种方式在方法中传递builder
        //第二种方式更加规范,第一种方式不是错的,但是耗费资源,因为builder完全没有必要做成一个属性.
        //在方法里面做接收builder就可以了,做成属性比较耗资源.
            
            /*this.builder.makeFloor();
        this.builder.makeHousetop();
        this.builder.makeWall();*/
            builder.makeFloor();
            builder.makeHousetop();
            builder.makeWall();
    }
    /*public HouseBuilder getBuilder() {
        return builder;
    }
    
    public void setBuilder(HouseBuilder builder) {
        this.builder = builder;
    }
      */ 
    }
    //客户端要修建一个房子
    public class MainClass {
        public static void main(String[] args) {
            //客户直接修造房子
    /*        House house = new House();
            house.setFloor("地板");
            house.setWall("墙");
            house.setHousetop("屋顶");*/
            //原本是修平房,现在改成修公寓了,要把这些属性都改掉.
            //这种方式的话又要直接修改客户端,而且对象的创建细节全部放在客户那里.
            //客户亲自去修.
            
            //一般是:客户->开发商->工人
            
            //由工程队来修
            //HouseBuilder builder = new PingFangBuilder();
            HouseBuilder builder = new GongyuBuilder();
            //调用工程队来修.
    /*builder.makeFloor();
    builder.makeWall();
    builder.makeHousetop();*/
            //由设计者调用工程队来做
            //HouseDirector director = new HouseDirector(builder);
            HouseDirector director = new HouseDirector();
            //以后学了反射之后动态控制加载哪一个工程队,更加方便了,客户端无需修改了.
            //只需要添加一个新的builder就可以了.
            //director.makeHouse();
            director.makeHouse(builder);
            House house = builder.getHouse();
    System.out.println(house.getFloor());
    System.out.println(house.getWall());
    System.out.println(house.getHousetop());
        }
    }
    //修平房的工人,实现修房子这个接口.
    /*
     * 平房工程队
     */
    public class PingFangBuilder implements HouseBuilder{
        House house = new House();
        @Override
        public void makeFloor() {
            // TODO Auto-generated method stub
            house.setFloor("平房-->地板");//builder建筑者为你修房子
        }
    
        @Override
        public void makeWall() {
            // TODO Auto-generated method stub
            house.setWall("平房-->墙");
        }
    
        @Override
        public void makeHousetop() {
            // TODO Auto-generated method stub
            house.setHousetop("平房-->房顶");
        }
    
        @Override
        public House getHouse() {
            // TODO Auto-generated method stub
            return house;
        }
         
    }
  • 相关阅读:
    findall查找 ^$*+?{ }{m,n}[].[.] w s d  D W
    find查找、split分隔、replace替换
    round四舍五入
    pow求一个数的n次幂
    iter创建一个可以被迭代的对象
    notepad++ gmt中文乱码问题
    matlab eps 字体用AI打开乱码的解决
    [转载]Matlab中使用xlswrite函数时出现服务器出现异常的解决方法
    How to determine which grid cells a line segment passes through?
    matlab给定点生成多边形,多边形掩膜处理
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6760032.html
Copyright © 2020-2023  润新知