常常在API使用中看到build等方法,你有思考过其对应的建造者模式吗?

今天,我们来谈谈常用设计模式之建造者模式

这里找不到好的API中使用build的例子,之后找到了再补上. 我们直接来看建造者模式

建造者模式中的四种角色

  • 产品
  • 抽象建造者
  • 实例建造者
  • 指挥官(也就是build)

使用细节

  1. 客户端(使用程序的那一端)不必知道产品内部组成的细节,将产品本身与产品的常见过程解耦.
  2. 每一个具体建造者都相对独立,而与其他建造者无关,因此可以很方便的替换具体建造者或增加新的建造者,用户使用不同的具体建造者可得到不同的产品对象.
  3. 可以更加精细的控制产品创建过程,将复杂产品的常见步骤分解在不同的方法中,使创建过程更加清晰,也更方便使用程序来控制创建过程
  4. 增加新的具体建造者无需修改原有类库的代码,指挥者类真滴抽闲建造者类编程,系统扩展方便,符合OCP原则.
  5. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的显示
  6. 如果产品内部变化复杂,也可能或导致需要定义很多具体的建造者类来实现这种变化,导致系统很庞大,因此在这种情况下也要考虑是否使用建造者模式
  7. 建造者模式和抽象工厂的对比
    1. 抽象工厂实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只需要关心什么产品由什么工厂生产即可。
    2. 建造者模式则是要求按照指定的蓝图建造产品,它主要的目的是通过组装零配件而产生一个新的配件

在理解了建造者模式的含义之后,我们来看看一个具体的建造者模式的实现
产品的实现:


package com.mzx.builder;

import lombok.Data;
import lombok.ToString;

/**
 * @author ZhenXinMa
 * @date 2020/1/26 20:16
 *
 *      产品
 *
 */
@Data
@ToString
public class House {

    private String houseBase;
    private String walls;
    private String roof;

}

抽象的建造者

package com.mzx.builder;

import java.security.PrivateKey;

/**
 * @author ZhenXinMa
 * @date 2020/1/26 20:17
 */
public abstract class HouseBuilder {

    private House house = new House();

    public House getHouse(){
        return this.house;
    }

    public abstract void buildBase();

    public abstract void buildWalls();

    public abstract void roofed();

    /**
     *  建造好之后返回
     * @return
     */
    public House constructHouse(){
        return house;
    }

}

具体的建造者

package com.mzx.builder;

/**
 * @author ZhenXinMa
 * @date 2020/1/26 20:21
 *
 *       普通房子
 *
 */
public class CommenHouseBuilder extends HouseBuilder {
	// 这里是一个抽象建造者的具体实现. 其只是对抽闲建造者默认组件进行疯转,实现零件初始化.
    @Override
    public void buildBase() {
        System.out.println("普通房子打地基5米");
        super.getHouse().setHouseBase("普通房屋地基:5米");
    }

    @Override
    public void buildWalls() {
        System.out.println("普通房子围墙5米");
        super.getHouse().setWalls("普通房屋围墙:5米");
    }

    @Override
    public void roofed() {
        System.out.println("封顶");
        super.getHouse().setRoof("普通房子封顶");
    }
}

指挥官: 建造者的含义

package com.mzx.builder;

/**
 * @author ZhenXinMa
 * @date 2020/1/26 20:23
 *
 *      指挥者 这里去指定建造流程   控制流程, 指挥官直面使用者, 使用者在使用的时候,只需要传入指定的建造者就可以初始化一个产品.
 *
 */
public class HouseDirector {

	// 这里传进来一个抽象建造者, 实现了面对抽象编程的思想,也符合了OCP原则.
    private HouseBuilder builder = null;

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

    public void setHouseBuilder(HouseBuilder builder){
        this.builder = builder;
    }
	
	// 指挥官控制建造流程 . 
    public House build(){
        builder.buildBase();
        builder.buildWalls();
        builder.roofed();
        return builder.constructHouse();
    }
}

客户端: 使用方

package com.mzx.builder;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * @author ZhenXinMa
 * @date 2020/1/26 20:48
 */
public class Client {
    public static void main(String[] args) {

        System.out.println("建筑普通房屋");
        // 由于我们要构建一个普通的房屋, 所以说我们使用普通房屋的建造者对象进行构建
        CommenHouseBuilder commenHouseBuilder = new CommenHouseBuilder();
        // 而CommenHouseBuilder只是实现了建造者默认的行为,也就是只是初始化了零件, 具体按顺序组装有指挥官进行build操作.
        HouseDirector director = new HouseDirector(commenHouseBuilder);
        // 指挥官按给定的建造者进行顺序组装. 指挥官控制了流程. 
        House build = director.build();
        System.out.println("输出建造好的普通房屋信息:"+build);

    }
}

到了这里建造者模式就算介绍完了, 虽然代码很少,但是要读懂确实要花费很多时间!
如果上面有哪里理解的不对, 还请留言指出~


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值