形式由功能而来。——沙利文
形式由功能而来。建造者模式刚好描述了这句话。
1. 建造者模式
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
特征:用户只需指定需要建造的类型就可以获得对象,建造过程及细节不需要了解。
属于创建型模式。
优点
封装性好,创建和使用分离
扩展性好,建造类之间的独立,一定程度上解耦
缺点
产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大
2. 简单写法
public class Book {
private String name;
private Double price;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
", address='" + address + '\'' +
'}';
}
}
public class BookBuilder {
private Book book = new Book();
public void setName(String name) {
book.setName(name);
}
public void setPrice(Double price) {
book.setPrice(price);
}
public void setAddress(String address) {
book.setAddress(address);
}
public Book build() {
return book;
}
}
public class Test {
public static void main(String[] args) {
BookBuilder bb = new BookBuilder();
bb.setName("Java");
bb.setAddress("天津");
bb.setPrice(32.2);
System.out.println(bb.build());
}
}
Book{name='Java', price=32.2, address='天津'}
一般来说,这种写法很少见,不推荐。
3. 链式写法
public class BookBuilder {
private Book book = new Book();
public BookBuilder setName(String name) {
book.setName(name);
return this;
}
public BookBuilder setPrice(Double price) {
book.setPrice(price);
return this;
}
public BookBuilder setAddress(String address) {
book.setAddress(address);
return this;
}
public Book build() {
return book;
}
}
public class Test {
public static void main(String[] args) {
BookBuilder bb = new BookBuilder()
.setName("Java")
.setAddress("天津")
.setPrice(32.2);
System.out.println(bb.build());
}
}
链式写法在各种框架中经常用到,在JDK
中StringBuilder
的append()
方法就是链式写法,mybatis
中的SqlSessionFactoryBuilder
,spring
中的BeanDefinitionBuilder
等等。
4. 建造者模式和工厂模式的区别
建造者模式更加注重方法的调用顺序,工厂模式注重于创造对象
创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的都一样。
关注点:工程模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出来对象,还要知道这个对象有哪些部件组成。
建造者模式根据建造过程的顺序不一样,最终的对象部件组成也不一样。
感谢您阅读本文,如果您觉得文章写的对您有用的话,请您点击上面的“关注”,点个赞,这样您就可以持续收到《JAVA架构师之路》的最新文章了。文章内容属于自己的一点点心得,难免有不对的地方,欢迎在下方评论区探讨,你们的关注是我创作优质文章的动力。