建造者模式
工厂模式提供的是创建单个类的模式,每个类的规模不能太过庞大。当一个类的规模太过庞大时,需要对其进行分解,然后根据规则一步一步构建而成。建造者模式就可以完成这样的任务。
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
。下面时建造者模式类图
对上面类图进行简要说明,方便我们理解建造者模式。假设我们需要一个产品,比如计算机。于是定义一个计算机类,在类中说明了这台计算需要哪些部件,比如显卡,声卡等。
// Product 定义 产品 需要那些东西
public class Product {
// 定义 主板
private String motherboards;
// 定义 声卡
private String soundcard;
// 下面 是对应 的get/set 方法
public String getMotherboards() {return motherboards;}
public void setMotherboards(String motherboards) {
this.motherboards = motherboards;
}
public String getSoundcard() { return soundcard;}
public void setSoundcard(String soundcard) {
this.soundcard = soundcard;
}
public void show(){
System.out.println("---->"+motherboards);
System.out.println("---->"+Soundcard);
}
}
已经获得了计算机构建清单,接下来就是交给建造者进行建造。建造者(Builder)根据构建清单设计出每个部件的建造方式,也就是定义各个子部件的抽象方法。
// 定义 产品的设计图纸
public interface Builder {
//构建主板
void builderMotherboards();
// 构建声卡
void builderSoundcard();
//返回产品对象
Product getResult();
}
具体的构建者只需要继承建造者(Builder)就可以按照建造方式,建造电脑需要的部分。
// 构建者A 对 图纸 进行了 具体的设计
public class ConcreteBuilderA implements Builder {
private Product product = new Product();
@Override
public void builderMotherboards() {
product.setMotherboards("构建者---A---造 主板");
}
@Override
public void builderSoundcard() {
product.setSoundcard("构建者---A---造 声卡");
}
// 返回建造完成的对象
@Override
public Product getResult() {
return product;
}
}
B
// 构建者B对 图纸 进行了 具体的设计
public class ConcreteBuilderB implements Builder {
private Product product = new Product();
@Override
public void builderMotherboards() {
product.setMotherboards("构建者---B---造 主板");
}
@Override
public void builderSoundcard() {
product.setSoundcard("构建者---B---造 声卡");
}
// 返回建造完成的对象
@Override
public Product getResult() {
return product;
}
}
到此为止,电脑的各个部件已经创建完毕,剩下就需要一个指挥者(Director)把它们组装成完整的计算机。
// 选取 构建者 创建的组件 ,进行组合
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
//产品构建与组装方法
public Product construct(){
builder.builderMotherboards();
builder.builderSoundcard();
return builder.getResult();
}
}
开始使用
public class Client{
public static void main(String[] args){
// 具体建造者
Builder builder=new ConcreteBuilderA();
// 进行组装
Director director=new Director(builder);
Product product=director.construct();
// 展示产品
product.show();
}
}
总结
通过上面学习简单了解了建造者模式的大致流程,建造者模式主要是用于创建一些复杂的对象,并且对象内部构建间的建造顺序是稳定的,但对象内部各个部分通常面临着复杂的变化,当发生变化时只需要在定义一个具体的建造者就可以了。