目录
建造者模式【Builder Pattern】适用场景?优缺点?建造者模式与工厂模式对比?建造者模式实现?
建造者模式介绍
建造者模式就是将一个复杂对象的构建过程与其表示分离 , 使得同样的构建过程 , 可以创建不同的表示 ;用户只需要指定需要建造的类型就可以得到该类型对应的产品实例 , 不关心建造过程细节 ;建造者模式就是如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品。
建造者模式适用场景
(1)结构复杂
对象有非常复杂的内部结构 , 有很多属性 ;
(2)分离创建和使用
想把复杂对象的创建和使用分离 ;
当创造一个对象需要很多步骤时 , 适合使用建造者模式 ;
当创造一个对象只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;
建造者模式优缺点
优点
封装性好:创建和使用分离
扩展性好:建造类之间相互独立 , 在 一定程度上解耦
缺点
增加类数量:产生多余的 Builder 对象
内部修改困难 :如果产品内部发生变化 , 建造者也要相应修改
建造者模式与工厂模式
建造者模式 | 工厂模式 | |
---|---|---|
关注点 | 一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象” | 关注的是一个产品整体,如车辆整体,无须关心产品的各部分是如何创建出来的 |
注重点 | 更注重于方法的调用顺序 | 注重于创建产品 , 不关心方法调用的顺序 |
产品复杂度 | 创建的则是一个复合产品,它由各个部件复合而成;建造者模式的产品对象粒度比较细 | 创建的产品一般都是单一性质产品,工厂模式的对象粒度比较粗 |
建造者模式实现
1、房子
package com.uhhe.common.design.builder;
/**
* 房子
*
* @author nizhihao
* @version 1.0.0
* @date 2023/2/28 11:31
*/
public class House {
/**
* 地基
*/
private String foundation;
/**
* 砌墙
*/
private String wall;
/**
* 封顶
*/
private String roofed;
public String getFoundation() {
return foundation;
}
public void setFoundation(String foundation) {
this.foundation = foundation;
}
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;
}
}
2、房子建造者抽象
package com.uhhe.common.design.builder;
/**
* 房子建造者
*
* @author nizhihao
* @version 1.0.0
* @date 2023/2/28 11:32
*/
public abstract class HouseBuilder {
protected House house = new House();
/**
* 打地基
*/
public abstract void buildFoundation();
/**
* 砌墙
*/
public abstract void buildWall();
/**
* 封顶
*/
public abstract void roofed();
/**
* 建造
*
* @return House
*/
public House buildHouse() {
return house;
}
}
3、建造者实现
公共建造
package com.uhhe.common.design.builder;
/**
* 公共建造
*
* @author nizhihao
* @version 1.0.0
* @date 2023/2/28 11:33
*/
public class CommonHouseBuilder extends HouseBuilder {
@Override
public void buildFoundation() {
System.out.println("common build foundation");
}
@Override
public void buildWall() {
System.out.println("common build wall");
}
@Override
public void roofed() {
System.out.println("common roofed");
}
}
高楼建造者
package com.uhhe.common.design.builder;
/**
* 高楼建造者
*
* @author nizhihao
* @version 1.0.0
* @date 2023/2/28 11:34
*/
public class HighHouseBuilder extends HouseBuilder {
@Override
public void buildFoundation() {
System.out.println("high house build foundation");
}
@Override
public void buildWall() {
System.out.println("high build wall");
}
@Override
public void roofed() {
System.out.println("high roofed");
}
}
4、建造指挥者
package com.uhhe.common.design.builder;
/**
* 建造指挥者
*
* @author nizhihao
* @version 1.0.0
* @date 2023/2/28 11:35
*/
public class HouseCommander {
HouseBuilder houseBuilder;
/**
* 构造器传入house builder
*
* @param houseBuilder HouseBuilder
*/
public HouseCommander(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
/**
* setter 传入house builder
*
* @param houseBuilder HouseBuilder
*/
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
/**
* 如何处理建造房子的流程,交给指挥者
*
* @return House
*/
public House buildHouse() {
houseBuilder.buildFoundation();
houseBuilder.buildWall();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
5、使用方法
package com.uhhe.common.design.builder;
/**
* @author nizhihao
* @version 1.0.0
* @date 2023/2/28 11:37
*/
public class HouseClient {
/**
* 建造者模式【Builder Pattern】
* <p>
* 建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),
* 使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
* 建造者模式是一步一步建造一个复杂对象,它允许用户只通过指定复杂对象的类型和内容就可以建造他们,
* 用户不需要指定内部的具体构建细节
* <p>
* <p>
* 建造者模式四个角色:
* ①Product(产品角色):
* 一个具体的产品对象
* ②Builder(抽象建造者):
* 创建一个Product对象的各个部件指定的接口/抽象类
* ③ConcreteBuilder(具体建造者):
* 实现接口,构建和装配各个部件
* ④Director(指挥者):
* 构建一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,
* 一:隔离了客户与对象的生产过程
* 二:负责控制产品对象的生产过程
*/
public static void main(String[] args) {
CommonHouseBuilder commonHouseBuilder = new CommonHouseBuilder();
House house = new HouseCommander(commonHouseBuilder)
.buildHouse();
}
}