建造者模式
简介
定义
- 在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。
- 而建造者模式就是使用多个简单的对象一步一步地构建成一个复杂的对象。
- 它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
- 建造者模式属于创建型模式,它提供了一种创建对象的最佳方式。
好处
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
缺点
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者模式四要素
- 产品
一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
- 抽象建造者
引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
- 建造者
实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
- 指挥者/导演
负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
实例
这里我以手机为例
1、产品类
包含多个组成部件的复杂对象
package BuilderPattern;
public class Product {
private String name;
private String price;
private String memory;//内存
private String battery;//电池
public void showItemFormat(){
System.out.println(name);
System.out.println(" 内存:"+memory+" 电池:"+battery+" 价格:"+price);
}
public void setName(String name) {
this.name = name;
}
public void setPrice(String price) {
this.price = price;
}
public void setMemory(String memory) {
this.memory = memory;
}
public void setBattery(String battery) {
this.battery = battery;
}
}
2、抽象建造者
包含创建产品各个子部件的抽象方法
package BuilderPattern;
public abstract class Builder {
public abstract void setMessage(String name,String price,String memory,String battery);
public abstract Product getProduct();
}
3、具体建造者
实现了抽象建造者接口
package BuilderPattern;
public class Worker extends Builder {
private Product product=new Product();
@Override
public void setMessage(String name, String price, String memory, String battery) {
product.setName(name);
product.setPrice(price);
product.setMemory(memory);
product.setBattery(battery);
}
@Override
public Product getProduct() {
return product;
}
}
4、指挥者/导演类
调用建造者中的方法完成复杂对象的创建。
package BuilderPattern;
public class Director {
private Builder builder=new Worker();
public Product getAProduct(){
builder.setMessage("华为P60","6999","512GB","6999毫安");
return builder.getProduct();
}
public Product getBProduct(){
builder.setMessage("IPhone 15","13999","512GB","4999毫安");
return builder.getProduct();
}
public Product getCProduct(){
builder.setMessage("小米Mix8","5999","256GB","10999毫安");
return builder.getProduct();
}
}
总结
用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
建造者模式和工厂模式的关注点不同:
建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
建造者模式主要适用于以下应用场景:
- 相同的方法,不同的执行顺序,产生不同的结果。
- 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
- 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
- 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。
关注博主,一起来学习设计模式吧