什么是建造者模式
Builder 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的标识。
建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
模式角色
1 Builder:为创建一个产品对象的各个部件指定抽象接口。包含一个用来返回最终产品的方法Product getProduct()。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
UML类图
建造者模式代码实现
public class Product {
// 产品名称
private String name;
// 产品说明
private String explain;
// 生产日期
private String dateOfManufacture;
// 产品厂商联系电话
private String phone;
// 产品厂商地址
private String address;
public Product(String name, String explain, String dateOfManufacture) {
this.name = name;
this.explain = explain;
this.dateOfManufacture = dateOfManufacture;
}
....省略getter/setter/toString
}
public interface Builder {
public void setAddress();
public void setPhone();
// 其会包含一个用来返回最终产品的方法Product getProduct()
public Product getProduct();
}
public class ConcreteBuilder implements Builder {
private Product product;
public ConcreteBuilder(String name, String explain, String dateOfManufacture) {
product = new Product(name, explain, dateOfManufacture);
}
@Override
public void setAddress() {
product.setAddress("产品生产地址");
}
@Override
public void setPhone() {
product.setPhone("产品联系电话");
}
@Override
public Product getProduct() {
return product;
}
}
public class Director {
public void constructProduct(Builder concreteBuilder) {
concreteBuilder.setAddress();
concreteBuilder.setPhone();
}
}
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder concreteBuilder = new ConcreteBuilder("产品名字", "生产说明", "生产日期");
director.constructProduct(concreteBuilder);
Product product = concreteBuilder.getProduct();
System.out.println(product);
// Product{name='产品名字', explain='生产说明', phone='产品联系电话', address='产品生产地址', dateOfManufacture='生产日期'}
}
}
优点
使用建造者模式可以使客户端不必知道产品内部组成的细节。
具体的建造者类之间是相互独立的,这有利于系统的扩展。
具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
缺点
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
网友评论