创建型模式-建造者模式

建造者模式


介绍

1.将复杂对象的建造过程抽象出来,使这个抽象过程不同实现方法可以构造不同表现(属性)的对象。

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.允许用户通过指定复杂对象类型和内容就可以构建。

当我们使用Builder的时候,一般来说,是因为创建这个对象的步骤比较多,每个步骤都需要一个零部件,最终组合成一个完整的对象。
建造者模式具有四个角色:

1 product(产品角色):一个具体的产品对象(属性,不同类型具有不同的功能或方法)

2 builder(抽象建造者:将产品对象的创建时需要的方法抽象成接口交给子类去实现

3 concreteBuilder(具体建造者):实现接口,构建和组建方法

4 director (指挥者):构建一个使用builder接口对象,主要是用于创建一个复杂对象** 一是:隔离了客户与对象的生产过程
二是:负责控制产品对象的生产过程**

**与工厂区别(个人理解):**其实就是在建造复杂对象的时候,由于需要不同的方法,所以我们将构建方法给抽象出来。与工厂的区别在于工厂是根据客户需求,返回所管理的不同对象(这里对象已经建造好),而建造者则是根据不同的需求构建不同的同类别(模板一样,具有功能差不多,但实现方法不一样)对象。建造者模式一般用来创建更为复杂的对象,


uml类图


uml(建造者)")


代码实现


所需要建造的产品

/**
 * @program: demo
 * @description: 建造者模式(模板房子/具体产品这里需要在建造时挑选地址,与选择样式)
 * @author: wfg
 * @create: 2021-05-04 20:01
 */
@Getter
@Setter
@ToString
public class House {
    private String add;
    private String style;
}


抽象类 将建造过程抽象出来


/**
 * @program: demo
 * @description:  抽象类将构建方法抽象出来
 * @author: wfg
 * @create: 2021-05-04 20:25
 */
public abstract class HouseBuilder {
    /**
     * @Description:  使用组合方式构建
     * @Author: wfg
     */
    protected  House house =new House();
    /**
     * @Description: 抽象出来的两个方法 
     * @Author: wfg
     */
    public  void  choiceAdd(){}
    public void  choiceStyle(){}
    /**
     * @Description: 返回房子(产品)
     * @Author: wfg
     */
    public House reHouse(){
        return house;
    }
}

子类实现


/**
 * @program: demo
 * @description: 实现类之一
 * @author: wfg
 * @create: 2021-05-04 20:08
 */
public class WfgHouse  extends HouseBuilder {

    @Override
    public void choiceAdd() {
        System.out.println("wfg选择了北极");
    }

    @Override
    public void choiceStyle() {
        System.out.println("wfg选择了蒙古包样式");
    }
}

/**
 * @program: demo
 * @description: 实现HouseInteger
 * @author: wfg
 * @create: 2021-05-04 20:11
 */
public class XwgHouse extends HouseBuilder {

  @Override
    public void choiceAdd() {
        System.out.println("小乌龟选择了水里");
    }

    @Override
    public void choiceStyle() {
        System.out.println("小乌龟选择了乌龟壳样式");
    }
}


指挥者、用于选择合适方法构造房子


/**
 * @program: demo
 * @description: 指挥者,动态地去指定制作流程
 * @author: wfg
 * @create: 2021-05-04 20:36
 */
public class HosDirector {
    /**
     * @Description: 组合builder
     * @Author: wfg
     */
    public HouseBuilder houseBuilder =null;
    /**
     * @Description: 为builder 赋值(构造器/set)
     * @Author: wfg
     */
   public HosDirector(HouseBuilder houseBuilder){
       this.houseBuilder=houseBuilder;
   }

   public void setHouseBuilder(HouseBuilder houseBuilder){
       this.houseBuilder =houseBuilder;
   }
   /**
    * @Description: 处理房子的流程(指挥者完成)
    * @Author: wfg
    */
    public House getHouse() {
        //选择建造方子的地址
        houseBuilder.choiceAdd();
        //选择建造房子的样式
        houseBuilder.choiceStyle();
        return  houseBuilder.reHouse();
    }
}


客户端使用

package com.example.demo.builder;

/**
 * @program: demo
 * @description: 客户端
 * @author: wfg
 * @create: 2021-05-04 21:02
 */
public class Client {
    public static void main(String[] args) {
        //给小乌龟盖房子(建造者builder)
        XwgHouse xwgHouse =new XwgHouse();
        //指挥者
        HosDirector hosDirector =new HosDirector(xwgHouse);
        //返回房子
        House house = hosDirector.getHouse();
    }
}

注意事项或细节

1.** 建造者模式所创建的产品一般具有较多的共同点,如果差异性很大,则不适合使用建造者模式。**

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

抽象工厂vs建造者模式

抽象工厂模式实现对产品家族的创建,一个产品家族具有一系列产品,采用抽象工厂模式不需要关心构建过程,只关心什么产品

而建造者是按照指定的蓝图构建产品,主要作用是通过组装配件而产生新产品

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值