设计模式之建造者模式全解析
程序员文章站
2022-05-03 23:41:55
建造者模式本质是diy,给你一坨积木,搭建出自己想要的样子。引言熟悉工厂模式的同学知道,工厂模式其实就是我们通知工厂,然后从工厂获得一个通用件,就像在淘宝买衣柜基本都是制作好的通用款,只需要下订单就可以了。然后建造者模式是怎么样的呢?建造者模式更像是定做款,就像衣柜,除了基本功能之外,商家可能还提供刻花纹,多开门的功能,这就和我们见到的通用功能不一样了,需要选配,需要订做,这就需要木匠重新建造一个新衣柜。Show You The Code/** * 衣柜 */@Datapu....
建造者模式本质是diy,给你一坨积木,搭建出自己想要的样子。
引言
熟悉工厂模式的同学知道,工厂模式其实就是我们通知工厂,然后从工厂获得一个通用件,就像在淘宝买衣柜基本都是制作好的通用款,只需要下订单就可以了。
然后建造者模式是怎么样的呢?建造者模式更像是定做款,就像衣柜,除了基本功能之外,商家可能还提供刻花纹,多开门的功能,这就和我们见到的通用功能不一样了,需要选配,需要订做,这就需要木匠重新建造一个新衣柜。
Show You The Code
/**
* 衣柜
*/
@Data
public class Closet {
//门
private String door;
//衣架
private String hanger;
//穿衣镜
private String mirror;
//装饰
private String decorate;
//隔间
private String compartment;
}
public class ClosetBuilder {
private Closet closet = new Closet();
//builder返回建造的对象
public Closet builder(){
return closet;
}
//返回ClosetBuilder, 为了可以实现链式调用
public ClosetBuilder door(String door){
closet.setDoor(door);
return this;
}
public ClosetBuilder hanger(String hanger) {
closet.setHanger(hanger);
return this;
}
public ClosetBuilder mirror(String mirror) {
closet.setMirror(mirror);
return this;
}
public ClosetBuilder decorate(String decorate) {
closet.setDecorate(decorate);
return this;
}
public ClosetBuilder compartment(String compartment) {
closet.setCompartment(compartment);
return this;
}
}
实现链式调用
public class ClosetBuilderTest {
public static void main(String[] args) {
ClosetBuilder ordinaryClosetBuilder = new ClosetBuilder();
Closet ordinaryCloset = ordinaryClosetBuilder.door("松木门")
.hanger("一个挂杆")
.mirror("需要穿衣镜")
.builder();
ClosetBuilder expensiveClosetBuilder = new ClosetBuilder();
Closet expensiveCloset = expensiveClosetBuilder.door("红木门")
.mirror("两个穿衣镜")
.compartment("多层隔间")
.decorate("精美雕花")
.hanger("红木晾衣架")
.builder();
System.out.println(ordinaryCloset);
System.out.println(expensiveCloset);
}
}
输出结果
上面的例子创建了两个实例,用户可以自定义类的属性那些有值,有什么值,以及默认值,并通过链式法则赋值。
建造者模式其实是一种set方式的改进,便于更好的定制化创建对象。
我们也可以使用lombok插件中的@Builder注解实现建造者模式,在Closet类顶部添加注解即可,这样代码看起来也更优雅。
/**
* 衣柜
*/
@Data
@Builder
public class Closet {
//.....
}
实际调用也非常简单:
Closet closet = Closet.builder().decorate("花纹").build();
参考文献