zoukankan      html  css  js  c++  java
  • 建造者模式

    模式介绍

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象构成。由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。建造者模式与工厂模式的区别是:建造者模式更加关注零件装配的顺序。

    模式优点

    1、将一个复杂对象的构建分离,使得同样的构建过程可以创建不同的表示。
    2、建造者独立,易扩展,便于控制细节风险。

    模式缺点

    1、产品必须有共同点,范围有限制。
    2、如内部变化复杂,会有很多的建造类。

    使用场景

    1、需要生成的对象具有复杂的内部结构。
    2、需要生成的对象内部属性本身相互依赖。

    系统建模

    1、盖房子模型,涉及对象:房子产品、抽象建造者、具体建造者、指挥者。

    系统实现

    /**
     * 房子产品
     */
    public class House {
        private int roofDeep;
        private int roofHigh;
        private int roofAres;
    
        public int getRoofDeep() {
            return roofDeep;
        }
    
        public void setRoofDeep(int roofDeep) {
            this.roofDeep = roofDeep;
        }
    
        public int getRoofHigh() {
            return roofHigh;
        }
    
        public void setRoofHigh(int roofHigh) {
            this.roofHigh = roofHigh;
        }
    
        public int getRoofAres() {
            return roofAres;
        }
    
        public void setRoofAres(int roofAres) {
            this.roofAres = roofAres;
        }
    }
    
    /**
     * 房子Builder的抽象类
     */
    public abstract class AbstarctHouseBuilder {
        protected House house = new House();
        public abstract AbstarctHouseBuilder buildBasic(int deep);
        public abstract AbstarctHouseBuilder buildWalls(int high);
        public abstract AbstarctHouseBuilder buildRoof(int ares);
    
        public House getHouse(){
            return house;
        }
    }
    
    /**
     *房子Builder的实现类
     */
    public class CommenHouseBuider extends AbstarctHouseBuilder {
    
        @Override
        public AbstarctHouseBuilder buildBasic(int deep) {
            System.out.println("打地基中,地基的深度:"+deep+"米");
            house.setRoofDeep(deep);
            return this;
        }
    
        @Override
        public AbstarctHouseBuilder buildWalls(int high){
            System.out.println("砌墙中,墙的高度:"+high+"米");
            house.setRoofHigh(high);
            return this;
        }
    
        @Override
        public AbstarctHouseBuilder buildRoof(int ares){
            System.out.println("建筑中,屋顶的面积:"+ares+"平法米。");
            house.setRoofAres(ares);
            return this;
        }
    }
    
    /**
     *建造房子的指挥者
     */
    public class HouseDirector {
        AbstarctHouseBuilder abstarctHouseBuilder = null;
    
        public HouseDirector(AbstarctHouseBuilder abstarctHouseBuilder){
            this.abstarctHouseBuilder = abstarctHouseBuilder;
        }
        public House constructor(){
            abstarctHouseBuilder.buildBasic(5)
                    .buildWalls(20)
                    .buildRoof(150);
            System.out.println("房子盖好了!");
            return abstarctHouseBuilder.getHouse();
        }
    }
    
    
    /**
     *客户端
     */
    public class Client {
        public static void main(String args[]){
            // 创建普通房子Builder
            AbstarctHouseBuilder buider = new CommenHouseBuider();
            HouseDirector houseDirector = new HouseDirector(buider);
            houseDirector.constructor();
        }
    }
    
    结果:
    打地基中,地基的深度:5米
    砌墙中,墙的高度:20米
    建筑中,屋顶的面积:150平法米。
    房子盖好了!
    
  • 相关阅读:
    安卓远程工具介绍及下载地址
    kylinos-kysec介绍
    远程控制工具ToDesk介绍
    kylinos桌面和服务器系统重置密码
    APT仓库目录和repository目录结构
    使用LVM实现动态磁盘管理
    如何实现访问http自动跳转https
    TypeScript学习 ———— 四、泛型
    TypeScript学习 ———— 三、function
    TypeScript学习 ———— 二、接口
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/12086754.html
Copyright © 2011-2022 走看看