写在后面

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

学习地址

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建造者模式

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

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

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

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

写在最初

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