建造者模式
介绍
1.将复杂对象的建造过程抽象出来,使这个抽象过程不同实现方法可以构造不同表现(属性)的对象。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.允许用户通过指定复杂对象类型和内容就可以构建。
当我们使用Builder的时候,一般来说,是因为创建这个对象的步骤比较多,每个步骤都需要一个零部件,最终组合成一个完整的对象。
建造者模式具有四个角色:
1 product(产品角色):一个具体的产品对象(属性,不同类型具有不同的功能或方法)
2 builder(抽象建造者:将产品对象的创建时需要的方法抽象成接口交给子类去实现
3 concreteBuilder(具体建造者):实现接口,构建和组建方法
4 director (指挥者):构建一个使用builder接口对象,主要是用于创建一个复杂对象** 一是:隔离了客户与对象的生产过程
二是:负责控制产品对象的生产过程**
**与工厂区别(个人理解):**其实就是在建造复杂对象的时候,由于需要不同的方法,所以我们将构建方法给抽象出来。与工厂的区别在于工厂是根据客户需求,返回所管理的不同对象(这里对象已经建造好),而建造者则是根据不同的需求构建不同的同类别(模板一样,具有功能差不多,但实现方法不一样)对象。建造者模式一般用来创建更为复杂的对象,
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建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族具有一系列产品,采用抽象工厂模式不需要关心构建过程,只关心什么产品。
而建造者是按照指定的蓝图构建产品,主要作用是通过组装配件而产生新产品