GoF23 建造者模式学习笔记
1. 建造者模式也属于创建型模式
2. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
3. 主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
优点:
1. 产品的建造和表示分离,实现了解耦;使用建造者模式可以使客户端不必知道内部组成细节
2. 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
3. 具体的建造者类之间相互独立(下面例子中表现为可以存在多种Worker),这有利于系统的扩
展,增加新的具体建造类无需修改原有类库的代码,符合“开闭原则”
缺点:
1. 建造者模式所创建的产品一般具有较多共同点,其组成部分相似,如果产品之间差异性很大,
则不适合使用建造者模式,因此其使用范围受一定限制
2. 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变
得很庞大
适用场景:
1. 需要生产的产品有复杂的内部结构,但这些产品具有共性
2. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同产品
3. 适合于一个具有较多的零件(属性)的产品(对象)的创建过程
与抽象工厂模式的区别:
1. 建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关产品,这些产品位于
不同的产品等级结构,构成了一个产品族
2. 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者
模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥类来指导对象的生成,包括对象
的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整对象
3. 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一
个汽车组装工厂,通过对部件的组装最后返回一辆完整的汽车
存在指导者
package builder.build_with_director;
public abstract class Builder {
abstract void buildPartOne();
abstract void buildPartTwo();
abstract void buildPartThree();
abstract void buildPartFour();
abstract Product getProduct();
}
package builder.build_with_director;
public class Product {
private String PartOne;
private String PartTwo;
private String PartThree;
private String PartFour;
public String getPartOne() {
return PartOne;
}
public void setPartOne(String partOne) {
PartOne = partOne;
}
public String getPartTwo() {
return PartTwo;
}
public void setPartTwo(String partTwo) {
PartTwo = partTwo;
}
public String getPartThree() {
return PartThree;
}
public void setPartThree(String partThree) {
PartThree = partThree;
}
public String getPartFour() {
return PartFour;
}
public void setPartFour(String partFour) {
PartFour = partFour;
}
@Override
public String toString() {
return "Product [PartOne=" + PartOne + ", PartTwo=" + PartTwo + ", PartThree=" + PartThree + ", PartFour="
+ PartFour + "]";
}
}
package builder.build_with_director;
public class Worker extends Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
void buildPartOne() {
product.setPartOne("Part One");
System.out.println("Part One Done!");
}
@Override
void buildPartTwo() {
product.setPartTwo("Part Two");
System.out.println("Part Two Done!");
}
@Override
void buildPartThree() {
product.setPartThree("Part Three");
System.out.println("Part Three Done!");
}
@Override
void buildPartFour() {
product.setPartFour("Part Four");
System.out.println("Part Four Done!");
}
@Override
Product getProduct() {
return product;
}
}
package builder.build_with_director;
public class Director {
public Product directBuild(Builder builder) {
builder.buildPartOne();
builder.buildPartTwo();
builder.buildPartThree();
builder.buildPartFour();
return builder.getProduct();
}
}
package builder.build_with_director;
public class Test {
public static void main(String[] args) {
Director director = new Director();
Product product = director.directBuild(new Worker());
System.out.println(product);
}
}
不存在指导者
自定义套餐中的顺序和组成部分
package builder.build_without_director;
public abstract class Builder {
abstract Builder buildA(String name);
abstract Builder buildB(String name);
abstract Builder buildC(String name);
abstract Builder buildD(String name);
abstract Product getProduct();
}
package builder.build_without_director;
public class Worker extends Builder{
private Product product;
public Worker() {
product = new Product();
}
@Override
Builder buildA(String name) {
product.setPartOne(name);
return this;
}
@Override
Builder buildB(String name) {
product.setPartTwo(name);
return this;
}
@Override
Builder buildC(String name) {
product.setPartThree(name);
return this;
}
@Override
Builder buildD(String name) {
product.setPartFour(name);
return this;
}
@Override
Product getProduct() {
return product;
}
}
package builder.build_without_director;
public class Product {
private String partOne = "Chips";
private String partTwo = "Cola";
private String partThree = "Hamburger";
private String partFour = "Ice-cream";
public String getPartOne() {
return partOne;
}
public void setPartOne(String partOne) {
this.partOne = partOne;
}
public String getPartTwo() {
return partTwo;
}
public void setPartTwo(String partTwo) {
this.partTwo = partTwo;
}
public String getPartThree() {
return partThree;
}
public void setPartThree(String partThree) {
this.partThree = partThree;
}
public String getPartFour() {
return partFour;
}
public void setPartFour(String partFour) {
this.partFour = partFour;
}
@Override
public String toString() {
return "Product [partOne=" + partOne + ", partTwo=" + partTwo + ", partThree=" + partThree + ", partFour="
+ partFour + "]";
}
}
package builder.build_without_director;
public class Test {
public static void main(String[] args) {
Worker worker = new Worker();
System.out.println(worker.getProduct());
System.out.println(worker.buildB("Juice").getProduct());
}
}