建造者模式——及其容易理解!!!

建造者模式

盖房项目需求

盖房项目需求

  1. 需要建房子:这一过程为打桩、砌墙、封顶
  2. 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是
    要求不要相同的.
  3. 请编写程序,完成需求.
代码实现:
House类:不管什么样的房子他都有地板,墙,和屋顶
package 设计模式.建造者模式.最初;

/**
 * @author 孙一鸣 on 2020/2/7
 */
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 class Client {

    public static void main(String[] args) {
        //客户直接造房子
        House house = new House();
        house.setFloor("地板");
        house.setWall("墙");
        house.setHousetop("屋顶");
    }
}

显然这种方式不合适,这个时候,房屋施工队就出场了,所谓术业有专攻,盖平房的施工队,盖高楼他就没有对应的材料了,但是他们建造楼房,都需要去铺地板垒墙建屋顶,这些大家都得有的工作,因此,我们为了应对多种房屋制造情况(高楼,别墅,平房等),我们建立一个施工队模板(接口),让具有不同材料的施工队去实现它


public interface HouseBuilder {
    //修地板
    public  void makeFloor();
    //修墙
    public  void makeWall();
    //修屋顶
    public  void makeHousetop();
}

平房施工队出场:


/**
 * @author 孙一鸣 on 2020/2/7
 */
public class PingFangBuilder implements HouseBuilder {
    //平房施工队首先得有房子的地基,这样才能在地基的基础上不断施工
    House house = new House();

    @Override
    public void makeFloor() {
        house.setFloor("给--平房--铺地板");
    }

    @Override
    public void makeWall() {
        house.setWall("给--平房--垒墙");
    }

    @Override
    public void makeHousetop() {
        house.setHousetop("给--平房--搭建屋顶");
    }
    //施工队建设完后,交出房子
    public House getHouse(){
        return house;
    }
}

【方案二:】客户自己联系了一个平房施工队,由施工队建造,客户收房

package 设计模式.建造者模式.最初;

/**
 * @author 孙一鸣 on 2020/2/7
 */
public class Client {

    public static void main(String[] args) {
        //客户直接造房子
//        House house = new House();
//        house.setFloor("地板");
//        house.setWall("墙");
//        house.setHousetop("屋顶");

        //有施工队建造房子
        //1.客户自己联系了一个平房施工队
        PingFangBuilder builder = new PingFangBuilder();
        builder.makeFloor();
        builder.makeWall();
        builder.makeHousetop();
        House house = builder.getHouse();
        System.out.println("house = " + house);
    }
}


这个时候就该引出我们今天的主角了-------建造者模式,大家先看一下这张图
在这里插入图片描述
我们发现上面客户还需要自己去联系施工队伍,由客户去直接和施工队交流不是一个好的方案,我们需要和施工队的管理人员去交流,有他们的管理人员去沟通自己的施工队,因此,我们引入一个新的成员Director,也就是大家所说的包工头
包工头Director代码实现:

package 设计模式.建造者模式.最初;

/**
 * @author 孙一鸣 on 2020/2/7
 */
public class 包工头 {
    //包工头有自己的施工队伍
  //  private HouseBuilder builder;

   // public 包工头(HouseBuilder builder) {
   //     this.builder = builder;
  //  }
    //包工头指挥自己的施工队干活
    public void makeHouse(HouseBuilder builder){
        builder.makeFloor();
        builder.makeWall();
        builder.makeHousetop();
    }
}

【方案三:】客户联系包工头,让包工头指挥施工队建造房子,客户收房

package 设计模式.建造者模式.最初;

/**
 * @author 孙一鸣 on 2020/2/7
 */
public class Client {

    public static void main(String[] args) {
        //客户直接造房子
//        House house = new House();
//        house.setFloor("地板");
//        house.setWall("墙");
//        house.setHousetop("屋顶");

        //有施工队建造房子
        //1.客户自己联系了一个平房施工队
//        PingFangBuilder builder = new PingFangBuilder();
//        builder.makeFloor();
//        builder.makeWall();
//        builder.makeHousetop();
//        House house = builder.getHouse();
//        System.out.println("house = " + house);

        //客户联系包工头,让包工头指挥施工队建造房子
        //施工队
        PingFangBuilder builder = new PingFangBuilder();
        包工头 director =new 包工头();
        //包工头指挥施工队做事。。。
        director.makeHouse(builder);
        House house = builder.getHouse();
        System.out.println("house = " + house);
    }
}


这个时候建造者模式已经表达完毕了,假如我们现在有钱了,要建高楼了,该怎么修改代码呢?
建造大楼,我们就联系包工头Director,让包工头去指挥自己的高楼施工队builder
高楼施工队builder代码实现:

package 设计模式.建造者模式.最初;

/**
 * @author 孙一鸣 on 2020/2/7
 */
public class HighBuilder implements HouseBuilder {
    //高楼施工队首先得有房子的地基,这样才能在地基的基础上不断施工
    House house = new House();

    @Override
    public void makeFloor() {
        house.setFloor("给--高楼--铺地板");
    }

    @Override
    public void makeWall() {
        house.setWall("给--高楼--垒墙");
    }

    @Override
    public void makeHousetop() {
        house.setHousetop("给--高楼--搭建屋顶");
    }
    //施工队建设完后,交出房子
    public House getHouse(){
        return house;
    }
}
  //客户联系包工头,让包工头指挥施工队建造房子
        //高楼施工队
        HighBuilder builder =new HighBuilder();
        包工头 director =new 包工头();
        //包工头指挥施工队做事。。。
        director.makeHouse(builder);
        House house = builder.getHouse();
        System.out.println("house = " + house);

看到这里我们就得需要联系理论来看建造者模式了

基本介绍:
  1. 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以
    将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方
    法可以构造出不同表现(属性)的对象

复杂对象 :房子
通过不同的施工队构造出不同的房子

  1. 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象
    的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

客户只需要去联系包工头,就可以得到房子

在这里插入图片描述

建造者模式的四个角色
  1. Product(产品角色): 一个具体的产品对象。==== 房子
  2. Builder(抽象建造者): 创建一个Product对象的各个部件指定的 接口/抽象类。
  3. ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。具体施工队
  4. Director(指挥者)包工头: 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:
    负责控制产品对象的生产过程。
建造者模式的注意事项和细节:
  1. 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解
    耦,使得相同的创建过程可以创建不同的产品对象

  2. 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替
    换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同
    的产品对象

  3. **可以更加精细地控制产品的创建过程 。**将复杂产品的创建步骤分解在不同的方法
    中,使得创建过程更加清晰,也更方便使用程序来控制创建过程

  4. 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,
    系统扩展方便,符合 “开闭原则”

  5. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间
    的差异性很大,则不适合使用建造者模式
    ,因此其使用范围受到一定的限制。

  6. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,
    导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式.

  7. 抽象工厂模式VS建造者模式
    抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不
    同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品
    由什么工厂生产即可
    。而建造者模式则是要求按照指定的蓝图建造产品,它的主要
    目的是通过组装零配件而产生一个新产品

发布了58 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40709110/article/details/104208711