参考:https://blog.csdn.net/weixin_48052161/article/details/119083633?spm=1001.2014.3001.5501
一、建造者模式和工厂模式区别:
建造者模式优点类似于工厂模式,都是用来创建一个对象,但是他们还是有很大的区别,主要区别如下:
建造者模式更加注重方法的调用顺序,工厂模式注重于创建完整对象
建造者模式根据不同的产品零件和顺序可以创造出不同的产品,而工厂模式创建出来的产品都是一样的
造者模式使用者需要知道这个产品有哪些零件组成,而工厂模式的使用者不需要知道,直接创建就行
适用场景:
建造者模式适用于一个具有较多的零件的复杂产品创建过程,而且产品的各个组成零件还会经常发生变化或者说需要支持动态变化,但是零件的种类却总体稳定的场景:
相同的方法,不同的执行顺序需要产生不同的执行结果
产品类非常复杂,调用不同的零件或者按照不同的顺序来组装产品后需要得到不同的产品
当初始化一个对象非常复杂,而且很多参数都具有默认值
代码阐述:
package com.example.dtest.design24;
public class BuilderDesignerMode {
int id; //id
String name; //姓名
int age; //年级
double weight; //体重
int score; //考试分数
Location loc; //家庭住址
private BuilderDesignerMode() {}
// 静态内部类:可以使用链式写法完成类的创建
public static class PersonBuilder {
BuilderDesignerMode p = new BuilderDesignerMode();
public PersonBuilder basicInfo(int id, String name, int age) {
p.id = id;
p.name = name;
p.age = age;
return this;
}
public PersonBuilder weight(double weight) {
p.weight = weight;
return this;
}
public PersonBuilder score(int score) {
p.score = score;
return this;
}
public PersonBuilder loc(String street, String roomNo) {
p.loc = new Location(street, roomNo);
return this;
}
// 链式写法最终要返回的类
public BuilderDesignerMode build() {
return p;
}
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", weight=" + weight +
", score=" + score +
", loc=" + loc +
'}';
}
}
class Location {
String street; //街道
String roomNo; //门牌号码
public Location(String street, String roomNo) {
this.street = street;
this.roomNo = roomNo;
}
@Override
public String toString() {
return "Location{" +
"street='" + street + '\'' +
", roomNo='" + roomNo + '\'' +
'}';
}
}
package com.example.dtest.design24;
public class DesignerTest {
public static void main(String[] args) {
BuilderDesignerMode p = new BuilderDesignerMode.PersonBuilder()
.basicInfo(1, "慧慧", 28)
//.score(20)
.weight(135)
.loc("冬瓜山", "23")
.build();
System.out.println(p);
}
}
建造者模式适用于使用的是大致相同的代码,但参数不同,增加代码复用性;
可用于比如说连接订阅某一个消息,但有几个不同的主题,可用该模式;
建造者模式—在源码中的应用
Netty中怎么使用Builder设计模式:
如下图所示,大家还记得,在服务端启动的时候有个启动辅助类ServerBootStrap,我们调用group方法、channel方法设置参数。这里面也使用了链式编程来设置相关参数。
我们到源码中看一下group方法。调用完设置参数后,返回this对象。
我们再看看其他方法,比如childOption方法,最后设置完参数依然返回this。
其他方法依然如此。这样设计的目的在于可以自由选择设置相关参数而不强求绑定。这样可以根据使用场景进行自由的设置参数。但是缺点也是明显的,那就是使用者自己要清楚设置哪些参数。