zoukankan      html  css  js  c++  java
  • Java设计模式(6)——建造者模式

    定义:Builder模式也叫建造者模式或者生成器模式,Builder模式是一种对象创建型模式之一,用来隐藏复合对象(对象的属性为另一个对象的引用)的创建过程,它把复合对象的创建过程交给Builder,通过Director来指导Builder创建对象。

    一、模式中包含的角色及其职责

    • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。
    • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品
    • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品、返回组建好的产品
    • 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

    二、Demo

    产品类

    /**
     *@desc 房子 复合对象
     *@auther yangshijing
     *@date 2018-3-20
     */
    public class House {
        /**
         * 地板,此应该为另一个对象的引用,为了更好理解建造者模式,这里简化为String类型
         */
        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(); }

    建造者

    /*
     * 平房工程队
     */
    /**
     *@desc 平房建造者
     *@auther yangshijing
     *@date 2018-3-20
     */
    public class PingFangBuilder implements HouseBuilder {
        House house = new House();
        public void makeFloor() {
            house.setFloor("平房-->地板");
        }
        public void makeHousetop() {
            house.setHousetop("平房-->房顶");
        }  
        public void makeWall() {
            house.setWall("平房-->墙");
        } 
        public House getHouse() {
            return house;
        }
    
    }
    /**
     *@desc 公寓建造者
     *@auther yangshijing
     *@date 2018-3-20
     */
    public class GongyuBuilder implements HouseBuilder{
        House house = new House();
        
        public House getHouse() {
            return house;
        }
    
        public void makeFloor() {
            house.setFloor("公寓-->地板");
        }
    
        public void makeHousetop() {
            house.setHousetop("公寓-->房顶");
        }
    
        public void makeWall() {
            house.setWall("公寓-->墙");
        }
        
    }

    导演类

    public class HouseDirector {    
        /**
       *指导建造者创建产品
       */
    public void makeHouse(HouseBuilder builder) { builder.makeFloor(); builder.makeWall(); builder.makeHousetop(); } }

    测试类

    public class MainClass {
    
        public static void main(String[] args) {
         //调用者只需创建Builder 和Director,如果想要生产不同的产品,只需创建不同的Builder实现类
            HouseBuilder builder = new GongyuBuilder();
            HouseDirector director = new HouseDirector();
            director.makeHouse(builder);
            
            House house = builder.getHouse();
            System.out.println(house.getFloor());
            System.out.println(house.getWall());
            System.out.println(house.getHousetop());
        }
    
    }

    三、UML类图

  • 相关阅读:
    Python入门练习实例
    关于“华为”的大数据分析
    numpy 安装
    JDBC URL格式定制
    Tomcat下JDBC连接样例
    命令行模式(CMD)下mysql查询中文显示乱码问题
    JDBC mysql驱动
    模态框点击空白处不关闭
    js动态绑定click事件时function传参问题
    云计算对传统软件工程的影响
  • 原文地址:https://www.cnblogs.com/realshijing/p/8607228.html
Copyright © 2011-2022 走看看