建造者模式
意图
- 建造者模式又被称为生成器模式,主要的意图就是能够使使用者一步一步的构建出完整的产品, 允许抽象缓冲层的存在,实现了产品和产品生产过程的解耦。
建造者模式角色
建造者模式角色分类主要有四类:
- 产品(Product):是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。
- 建造者(Concrete Builders):提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
- 抽象建造者(Builder):接口声明在所有类型生成器中通用的产品构造步骤。
- 指挥者(Director):类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。
– 客户端(Client):需要使用到产品的一端
示例
- 目的:使用建造者模式建造一个房子
- 分析角色: 首先房子就是属于我们的一种产品(Product),我们需要构建出一个抽象建造者(Builder)来定义构建房子的一些抽象方法, 在构建出具体的建造者(Concrete Builders) 来实现抽象建造者定义的抽象方法, 由指挥者来决定是否生产构建。
类图
代码实现
House.java
/**
* @ClassName: House
* @Description: House -> 产品
* @Author: a3818
* @Date: 2021/6/3 11:05
* @Version 1.0
* @Copyright
**/
@Data
public class House {
/**
* House的一些属性特征
*/
/**
* 颜色
*/
private String color;
/**
* 钢筋
*/
private String rebar;
/**
* 房子大小
*/
private String length;
/**
* 房子宽度
*/
private String width;
/**
* 定义具体建造者
* @return
*/
public static AbstractHouseBuilder build(){
// 注意:生产者必须不同才能生产出不同的产品
AbstractHouseBuilder abstractHouseBuilder = new HouseBuilder();
abstractHouseBuilder.setHouse(new House());
return abstractHouseBuilder;
}
}
复制代码
AbstractHouseBuilder.java
/**
* @ClassName: AbstractHouseBudier
* @Description: AbstractHouseBuilder -> 抽象生产者
* @Author: a3818
* @Date: 2021/6/3 11:09
* @Version 1.0
* @Copyright
**/
@Data
public abstract class AbstractHouseBuilder {
/**
* 生产对象
*/
protected House house = null;
/**
* 定义抽象方法,返回AbstractHouseBuilder对象
*/
public abstract AbstractHouseBuilder color(String col);
public abstract AbstractHouseBuilder rebar(String reb);
public abstract AbstractHouseBuilder length(String len);
public abstract AbstractHouseBuilder width(String wid);
}
复制代码
HouseBuilder.java
/**
* @ClassName: HouseBuild
* @Description: HouseBuild -> 建造者
* @Author: a3818
* @Date: 2021/6/3 11:33
* @Version 1.0
* @Copyright
**/
public class HouseBuilder extends AbstractHouseBuilder{
@Override
public AbstractHouseBuilder color(String col) {
house.setColor(col);
return this;
}
@Override
public AbstractHouseBuilder rebar(String reb) {
house.setRebar(reb);
return this;
}
@Override
public AbstractHouseBuilder length(String len) {
house.setLength(len);
return this;
}
@Override
public AbstractHouseBuilder width(String wid) {
house.setWidth(wid);
return this;
}
}
复制代码
HouseBuild.java
/**
* @ClassName: HouseBuilder
* @Description: HouseBuilder -> 指挥者
* @Author: a3818
* @Date: 2021/6/3 11:10
* @Version 1.0
* @Copyright
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HouseBuild {
private AbstractHouseBuilder abstractHouseBuilder;
}
复制代码
Client.java
/**
* @ClassName: Client
* @Description: client -> 客户端
* @Author: a3818
* @Date: 2021/6/3 13:59
* @Version 1.0
* @Copyright
**/
public class Client {
public static void main(String[] args) {
AbstractHouseBuilder color = House.build().width("10米").rebar("钢筋水泥").length("10米").color("白色");
AbstractHouseBuilder color2 = House.build().width("15米").rebar("水泥钢筋").length("15米").color("粉色");
System.out.println(color.house);
System.out.println(color2.house);
}
}
复制代码
测试结果
House(color=白色, rebar=钢筋水泥, length=10米, width=10米)
House(color=粉色, rebar=水泥钢筋, length=15米, width=15米)
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END