建造者模式(生成器模式):用于产品和产品建造过程解耦;
方式一、4个角色:
1、产品-具体对象
2、抽象建造者-定义建造者公共方法
3、具体建造者-具体的建造实现
一个产品属性、多个建造方法、一个返回产品方法;
产品作为属性,构造方法传进去,多个建造方法修改产品,一个get产品方法返回最终建造成的产品
4、指挥者-调用建造者方法构造具体的产品
一个创建产品对象的方法,传入抽象构造者,构造者调用多个建造方法,最后调用建造者的返回产品方法得到产品
使用:建指挥者对象,调用创建产品对象的方法,返回由指挥者调用建造者建造的具体对象;
方式二、3个角色:
1、产品-具体对象
2、抽象建造者-定义建造者公共方法
3、具体建造者-具体的建造实现
一个产品属性、多个建造方法(每个方法都返回this)、一个返回产品方法
产品作为属性,构造方法传进去,多个建造方法修改产品然后返回this,方便链式调用,一个get产品方法返回最终建造成的产品;
使用:new一个建造者,链式调用建造方法,最后调用建造者的返回产品方法得到产品;
区别:方式二省了指挥者,更加灵活,更符合定义。可以根据用户需求自由定义更改内容,并且无需改变具体的构造方式。就可以生产出不同复杂产品;
本文demo编码实现<方式二、3个角色>这种建造者模式。
故事背景:
深圳科技园,某日晚10点,程序员小李刚发完版下班,肚饿饿了,心想这次发版还好,遇到的问题也都解决了,拿出手机准备看看附件哪里有好吃的,一眼看到房东的信息,"你好,x月房租2xxx,请于xx号之前...",小李看了看自己卡里的余额...,来深一年多,知道公司背后一家炒河粉店还不错,就去那里吧;
来到路边炒粉摊,摊子正上方"正宗潮汕牛肉粉面"格外明显,来过很多次,这次发版还算顺利,小李对摊主说"靓仔,来份炒河粉,加牛肉、火腿肠、鸡蛋、豆芽、白菜,加辣"...
UML类图:
代码实现:
import lombok.Data;
/**
* 建造者模式
*/
//具体产品-炒粉
//这里偷个懒和代码整洁,用了下lombok
@Data
class Product {
private String buildA; //河粉
private String buildB; //细粉
private String buildC; //细面
private String buildD; //牛肉
private String buildE; //火腿肠
private String buildF; //鸡蛋
private String buildG; //豆芽
private String buildH; //白菜
}
//抽象建造者
abstract class Builder {
//炒河粉
abstract Builder bulidA(String mes);
//炒细粉
abstract Builder bulidB(String mes);
//炒细面
abstract Builder bulidC(String mes);
//加牛肉
abstract Builder bulidD(String mes);
//加火腿肠
abstract Builder bulidE(String mes);
//加鸡蛋
abstract Builder bulidF(String mes);
//加豆芽
abstract Builder bulidG(String mes);
//加白菜
abstract Builder bulidH(String mes);
//获取炒粉
abstract Product build();
}
//具体建造者-炒粉小哥靓仔
class ConcreteBuilder extends Builder {
//炒粉
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
Product build() {
return product;
}
@Override
Builder bulidA(String mes) {
product.setBuildA(mes);
return this;
}
@Override
Builder bulidB(String mes) {
product.setBuildB(mes);
return this;
}
@Override
Builder bulidC(String mes) {
product.setBuildC(mes);
return this;
}
@Override
Builder bulidD(String mes) {
product.setBuildD(mes);
return this;
}
@Override
Builder bulidE(String mes) {
product.setBuildE(mes);
return this;
}
@Override
Builder bulidF(String mes) {
product.setBuildF(mes);
return this;
}
@Override
Builder bulidG(String mes) {
product.setBuildG(mes);
return this;
}
@Override
Builder bulidH(String mes) {
product.setBuildH(mes);
return this;
}
}
public class BuilderMode {
public static void main(String[] args) {
//具体建造者-炒粉小哥
Builder builder1 = new ConcreteBuilder();
//炒粉-高配版
Product productHigh = builder1.bulidA("河粉")
.bulidD("牛肉")
.bulidE("火腿肠")
.bulidF("鸡蛋")
.bulidG("豆芽")
.bulidH("白菜").build();
System.out.println("高配版炒河粉: ");
System.out.println(productHigh);
//具体建造者-炒粉小哥
Builder builder2 = new ConcreteBuilder();
//炒粉-低配版
Product productLow = builder2.bulidA("河粉")
.bulidF("鸡蛋")
.bulidG("豆芽").build();
System.out.println("低配版炒河粉: ");
System.out.println(productLow);
}
}