什么是建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(即产品)。
建造者模式的角色
Builder:抽象建造者,定义建造产品零部件的方法
ConcreteBuilder:具体建造者,实现建造零部件的方法
Director:指挥官,决定使用哪种建造者创建产品
Product:产品类
实例:
Builder:
public interface Builder {
void BulidePartA();
void BulidePartB();
void BuildePartC();
Product getProduct();
}
Product:
public class Product {
private String partA;
private String partB;
private String partC;
public Product(String partA, String partB, String partC) {
this.partA = partA;
this.partB = partB;
this.partC = partC;
}
public void display(){
System.out.println(partA+"、"+partB+"、"+partC+"组成的汉堡");
}
}
BuilderA:
public class BuilderA implements Builder{
private String partA;
private String partB;
private String partC;
@Override
public void BulidePartA() {
partA="牛肉";
}
@Override
public void BulidePartB() {
partB="培根";
}
@Override
public void BuildePartC() {
partC="面包";
}
@Override
public Product getProduct() {
return new Product(partA,partB,partC);
}
}
BuilderB:
public class BuilderB implements Builder{
private String partA;
private String partB;
private String partC;
@Override
public void BulidePartA() {
partA="鸡肉";
}
@Override
public void BulidePartB() {
partB="生菜";
}
@Override
public void BuildePartC() {
partC="面包";
}
@Override
public Product getProduct() {
return new Product(partA,partB,partC);
}
}
Director:
public class Director {
private Builder builder;
void setBuilder(Builder builder){
this.builder=builder;
}
Product getProduct(){
builder.BuildePartC();
builder.BulidePartA();
builder.BulidePartB();
return builder.getProduct();
}
}
main:
public class main {
public static void main(String[] args){
Director dire=new Director();
dire.setBuilder(new BuilderA());
Product A=dire.getProduct();
A.display();
dire.setBuilder(new BuilderB());
Product B=dire.getProduct();
B.display();
}
}
运行结果:
建造者模式的一点思考
优点:
建造者模式将对象的构建过程封装,用户只需要指定建造者即可获得对象,建造者模式把一个复杂对象看成由若干部分组成,使复杂对象的创建变得更加有条理,增加新的建造者无需修改现有代码,很好的满足了开闭原则
建造者模式与一系列工厂模式的不同:
建造者模式构建的一组对象一般具有相同的特征,比如奥迪和宝马车,两者都有轮子、方向盘等,工厂模式创建的一组对象的特征可以不同,建造者模式用于复杂对象的创建,它将复杂对象的创建分为几个步骤,依次执行这些步骤来创建对象,而工厂模式创建的对象较为简单,不需要划分创建步骤即可创建,至于一个对象是否复杂,由自己决定