开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情
觉得对你有益的小伙伴记得点个赞+关注
后续完整内容持续更新中
希望一起交流的欢迎发邮件至javalyhn@163.com
1. 建造者模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2. 建造者模式使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时。
- 多个部件或者零件,都可以装配到不同的对象中,但是产生的结果又不同。
- 产品类十分的复杂,或者产品类中的调用顺序不同产生了不同的技能。
- 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反最初的设计目标。
- StringBuilder:append(); 给谁append呢?
- Swagger-ApiBuilder:
- 快速实现->Lombok-Builder模式
3. 建造者模式的实现
我们设定以下做手机的过程。
AbstractBuilder
/**
* 抽象建造者
*/
public abstract class AbstractBuilder {
Phone phone;
abstract AbstractBuilder customCpu(String cpu);
abstract AbstractBuilder customMem(String mem);
abstract AbstractBuilder customDisk(String disk);
abstract AbstractBuilder customCam(String cam);
Phone getProduct(){
return phone;
}
}
XiaomiBuilder
public class XiaomiBuilder extends AbstractBuilder{
public XiaomiBuilder(){
phone = new Phone();
}
/**
*
* @param cpu
*/
@Override
AbstractBuilder customCpu(String cpu) {
phone.cpu = cpu;
return this;
}
@Override
AbstractBuilder customMem(String mem) {
phone.mem = mem;
return this;
}
@Override
AbstractBuilder customDisk(String disk) {
phone.disk = disk;
return this;
}
@Override
AbstractBuilder customCam(String cam) {
phone.cam = cam;
return this;
}
}
Phone
public class Phone {
protected String cpu;
protected String mem;
protected String disk;
protected String cam;
public Phone() {
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + ''' +
", mem='" + mem + ''' +
", disk='" + disk + ''' +
", cam='" + cam + ''' +
'}';
}
public String getCpu() {
return cpu;
}
public String getMem() {
return mem;
}
public String getDisk() {
return disk;
}
public String getCam() {
return cam;
}
}
public class MainTest {
public static void main(String[] args) {
AbstractBuilder builder = new XiaomiBuilder();
Phone phone = builder.customCpu("骁龙8个8")
.customCam("2亿")
.customDisk("1T")
.customMem("16G")
.getProduct();
}
}
我们可以直接使用lombok的@Builder注解,标在产品类上,就可以直接使用建造者模式
Phone
@Builder
public class Phone {
protected String cpu;
protected String mem;
protected String disk;
protected String cam;
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + ''' +
", mem='" + mem + ''' +
", disk='" + disk + ''' +
", cam='" + cam + ''' +
'}';
}
get().......
}
XiaomiBuilder
public class XiaomiBuilder extends AbstractBuilder{
public XiaomiBuilder(){
// phone =
// new Phone();
phone = Phone.builder().build();//关键
}
Phone build = Phone.builder()
.cpu("1")
.mem("2")
.cam("3")
.disk("4")
.build();
System.out.println(build);
4. 建造者模式的优点
封装性:
使用建造者模式可以是客户端不必知道产品内部的细节。建造者独立,容易扩展。
便于控制细节风险:
由于具体的构建者是独立的,因此可以对创建过程逐步细化,而不对其他的模块产生任何影响。