作为码农中的一员,需要不断的学习。我在学习之余把关于自己阅读《大话设计模式》的笔记和自己的一些总结 写成博客和大家分享,也希望采用这种方式记录自己的学习之旅。本文仅供学习交流使用,侵权必删。不用于商业目的,转载请注明出处。
建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式就是是将一个复杂的对象分解为多个简单的对象,然后通过具体建造者类一步一步构建而成。
建造者模式主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
建造者模式的类图
- 接口类
Builder
为建造者,定义了创建产品各个子部件的抽象方法的接口。 - 类
ConcreteBuilderB
和ConcreteBuilderA
为具体建造者,它们实现了Builder
接口,并对创建子部件的方法进行了实现。 - 类
Product
为具体的产品,一般包含多个组成部件。 - 类
Director
为指挥者,是构建一个使用Builder
接口的对象。
建造者模式的代码
// 具体的产品对象,由两部分组成
public class Product {
String message = "";
String address = "";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
// 构建者
public interface Builder {
public void builderProductMessage();
public void builderProductAddress();
public Product getResult();
}
// 具体构建者A
public class ConcreteBuilderA implements Builder {
private Product product = new Product();
@Override
public void builderProductMessage() {
product.setMessage("通过具体建造类A 构建一个产品基本信息");
}
@Override
public void builderProductAddress() {
product.setAddress("通过具体建造类A 构建一个产品的地址");
}
@Override
public Product getResult() {
return product;
}
}
// 具体构建者B
public class ConcreteBuilderB implements Builder {
private Product product = new Product();
@Override
public void builderProductMessage() {
product.setMessage("通过具体建造类B 构建一个产品基本信息");
}
@Override
public void builderProductAddress() {
product.setAddress("通过具体建造类B 构建一个产品的地址");
}
@Override
public Product getResult() {
return product;
}
}
// 指挥者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct(){
builder.builderProductMessage();
builder.builderProductAddress();
return builder.getResult();
}
}
public class Test {
public static void main(String[] args) {
//Builder builder = new ConcreteBuilderB();
Builder builder = new ConcreteBuilderA(); // 选定具体构建
Director director = new Director(builder);// 交给指挥者进行调度
Product product = director.construct();
System.out.println(product.getMessage());
System.out.println(product.getAddress());
}
}
建造者模式的优缺点
优点
- 每个具体建造者是相互独立的,有利于系统的扩展
- 用户只需要指定需要建造的类型 就可以得到它们,而具体建造的过程和细节不需要知道,方便维护。
- 可以更加精细化控制产品的创建过程。
- 增加具体的建造者类时无需要修改源代码,满足
开闭原则
。
缺点
- 产品的组成结构必须相同,限制了使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类