乐趣区

关于java:设计模式学习07Java实现建造者模式

写在后面

  • 记录学习设计模式的笔记
  • 进步对设计模式的灵活运用

学习地址

https://www.bilibili.com/video/BV1G4411c7N4

https://www.bilibili.com/video/BV1Np4y1z7BU

参考文章

http://c.biancheng.net/view/1317.html

我的项目源码
https://gitee.com/zhuang-kang/DesignPattern

8,建造者模式

8.1 建造者模式的定义和特点

建造者(Builder)模式的定义:指将一个简单对象的结构与它的示意拆散,使同样的构建过程能够创立不同的示意,这样的设计模式被称为建造者模式。它是将一个简单的对象合成为多个简略的对象,而后一步一步构建而成。它将变与不变相拆散,即产品的组成部分是不变的,但每一部分是能够灵便抉择的。

该模式的次要长处如下:

  1. 封装性好,构建和示意拆散。
  2. 扩展性好,各个具体的建造者互相独立,有利于零碎的解耦。
  3. 客户端不用晓得产品外部组成的细节,建造者能够对创立过程逐渐细化,而不对其它模块产生任何影响,便于管制细节危险。

其毛病如下:

  1. 产品的组成部分必须雷同,这限度了其应用范畴。
  2. 如果产品的外部变动简单,如果产品外部发生变化,则建造者也要同步批改,前期保护老本较大。

8.2 建造者模式的构造与实现

8.2.1 建造者模式的构造

  1. 产品角色(Product):它是蕴含多个组成部件的简单对象,由具体建造者来创立其各个零部件。
  2. 形象建造者(Builder):它是一个蕴含创立产品各个子部件的形象办法的接口,通常还蕴含一个返回简单产品的办法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,实现简单产品的各个部件的具体创立办法。
  4. 指挥者(Director):它调用建造者对象中的部件结构与拆卸办法实现简单对象的创立,在指挥者中不波及具体产品的信息。

8.2.2 代码实现

House 产品角色

package com.zhuang.builder;

/**
 * @Classname House
 * @Description  产品实现类
 * @Date 2021/3/20 11:49
 * @Created by dell
 */

public class House {
    private String ground;
    private String wall;
    private String roofed;

    public House() {}

    public House(String ground, String wall, String roofed) {
        this.ground = ground;
        this.wall = wall;
        this.roofed = roofed;
    }

    public String getGround() {return ground;}

    public void setGround(String ground) {this.ground = ground;}

    public String getWall() {return wall;}

    public void setWall(String wall) {this.wall = wall;}

    public String getRoofed() {return roofed;}

    public void setRoofed(String roofed) {this.roofed = roofed;}

    @Override
    public String toString() {
        return "House{" +
                "ground='" + ground + '\'' +
                ", wall='" + wall + '\'' +
                ", roofed='" + roofed + '\'' +
                '}';
    }
}

HouseBuilder 形象建造者

package com.zhuang.builder;

/**
 * @Classname HouseBuilder
 * @Description 形象建造者
 * @Date 2021/3/20 11:49
 * @Created by dell
 */

public abstract class HouseBuilder {
    // 创立产品对象
    protected House house = new House();

    // 生产产品流程
    public abstract void buildGround();

    public abstract void buildWall();

    public abstract void buildRoofed();

    // 返回产品对象
    public House getHouse() {return house;}
}

HighHouse 具体建造者

package com.zhuang.builder;

/**
 * @Classname HighHouse
 * @Description 具体建造者
 * @Date 2021/3/20 11:51
 * @Created by dell
 */

public class HighHouse extends HouseBuilder {

    @Override
    public void buildGround() {house.setGround("100 平");
        System.out.println("高楼:打地基");
    }

    @Override
    public void buildWall() {house.setWall("50 米");
        System.out.println("高楼:砌墙 50 米");
    }

    @Override
    public void buildRoofed() {house.setRoofed("天窗");
        System.out.println("别墅:盖天窗");
    }
}

VillaHouse 具体建造者

package com.zhuang.builder;

/**
 * @Classname VillaHouse
 * @Description  具体建造者
 * @Date 2021/3/20 11:51
 * @Created by dell
 */

public class VillaHouse extends HouseBuilder {

    @Override
    public void buildGround() {house.setGround("200 平");
        System.out.println("别墅:打地基");
    }

    @Override
    public void buildWall() {house.setWall("10 米");
        System.out.println("别墅:砌墙 10 米");
    }

    @Override
    public void buildRoofed() {house.setRoofed("天花板");
        System.out.println("别墅:盖天花板");
    }
}

HouseDirector 指挥者

package com.zhuang.builder;

/**
 * @Classname HouseDirector
 * @Description  工程指挥者
 * @Date 2021/3/20 11:50
 * @Created by dell
 */

public class HouseDirector {
    private HouseBuilder houseBuilder;

    public HouseDirector(HouseBuilder houseBuilder) {this.houseBuilder = houseBuilder;}

    public House build() {houseBuilder.buildGround();
        houseBuilder.buildWall();
        houseBuilder.buildRoofed();
        return houseBuilder.getHouse();}
}

Client

package com.zhuang.builder;

/**
 * @Classname Client
 * @Description  产品试用客户端
 * @Date 2021/3/20 11:51
 * @Created by dell
 */

public class Client {public static void main(String[] args) {House house1 = new HouseDirector(new VillaHouse()).build();
        System.out.println(house1);
        System.out.println("============================================");
        House house2 = new HouseDirector(new HighHouse()).build();
        System.out.println(house2);
    }
}

8.3 建造者模式的利用场景

  • 雷同的办法,不同的执行程序,产生不同的后果。
  • 多个部件或整机,都能够拆卸到一个对象中,然而产生的后果又不雷同。
  • 产品类非常复杂,或者产品类中不同的调用程序产生不同的作用。
  • 初始化一个对象特地简单,参数多,而且很多参数都具备默认值。

9,创建者模式比照

9.1 工厂办法模式 VS 建造者模式

工厂办法模式重视的是 整体对象的创立形式 ;而建造者模式重视的是 部件构建的过程,意在通过一步一步地准确结构创立出一个简单的对象。

咱们举个简略例子来阐明两者的差别,如要制作一个超人,如果应用工厂办法模式,间接产生进去的就是一个力大无穷、可能翱翔、内裤外穿的超人;而如果应用建造者模式,则须要组装手、头、脚、躯干等局部,而后再把内裤外穿,于是一个超人就诞生了。

9.2 形象工厂模式 VS 建造者模式

形象工厂模式实现对产品家族的创立,一个产品家族是这样的一系列产品:具备不同分类维度的产品组合,采纳形象工厂模式则是不须要关怀构建过程,只关怀什么产品由什么工厂生产即可。

建造者模式则是要求依照指定的蓝图建造产品,它的次要目标是通过组装零配件而产生一个新产品。

如果将形象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装能够返回一辆残缺的汽车。

  • 建造者模式 更加重视办法的调用程序 ,工厂模式 重视创建对象
  • 创建对象的力度不同,建造者模式创立简单的对象,由各种简单的部件组成,工厂模式创立进去的对象都一样
  • 关注重点不一样,工厂模式只须要把对象创立进去就能够了,而建造者模式不仅要创立出对象,还要晓得对象由哪些部件组成。
  • 建造者模式依据建造过程中的程序不一样,最终对象部件组成也不一样。

写在最初

  • 如果我的文章对你有用,请给我点个👍,感激你😊!
  • 有问题,欢送在评论区指出!💪
退出移动版