当客户需要一个产品时,把需要的参数传递个导向器,导向器根据传递的参数调用具体的生成器,具体的生成器通过一系列的操作(getAnimal()通过调用其它的接口方法实现)最会返回一个产品。
Bridge模式的优点:
1. 它使你可以改变一个产品的内部表示,Builder对象提供给导向器一个构造产品的抽象接口,该接口使得生成器可以隐藏这个产品的表示和内部结构,他同时也隐藏了该产品是如何装配的,因为产品时通过抽象接口构造的(注:本例子把接口的实现放在具体类中了),你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
2. 他将构造代码和表示代码分开,这有点类似于模板模式。所不同的是模版模式最终是完成复杂的工作,而生成器的目的是要生成一个复杂的对象。
3. 他使得你对构造过程进行更加精细的控制。Builder模式是在导向者的控制下一步一步构造产品的,仅当该产品完成时,导向者才从生成器中取回产品。因此Builder模式能更好的反映产品的构造过程,使你可以更精细的控制构建过程,从而能更精细的控制所的产品的内部结构。
代码示例:
AnimalBuilder:代码
package builder;
public interface AnimalBuilder{
public void buildName();
public void buildLegs();
public void buildMeat();
public Animal getAnimal();
}
ChickenBuilder的代码:
package builder;
public class ChickenBuilder implements AnimalBuilder{
private Animal chicken = null;
public ChickenBuilder(){
chicken = new Animal();
}
public void buildName(){
chicken.setName("chicken");
}
public void buildLegs(){
chicken.setLegs(2);
}
public void buildMeat(){
chicken.setMeat("chicken");
}
public Animal getAnimal(){
buildName();
buildLegs();
buildMeat();
return chicken;
}
}
Animal代码:
package builder;
public class Animal{
private String name;
private String meat;
private int legs;
public String getName(){
return name;
}
public String getMeat(){
return meat;
}
public int getLegs(){
return legs;
}
public void setName(String aName){
name = aName;
}
public void setMeat(String aMeat){
meat = aMeat;
}
public void setLegs(int alegs){
legs = alegs;
}
}
Director代码:
package builder;
public class Director{
public Animal getAnimal(String aName){
if(aName.equals("chicken")){
return new ChickenBuilder().getAnimal();
}
else if(aName.equals("pig")){
return new PigBuilder().getAnimal();
}
else return null;
}
}
客户端代码:
package builder;
public class Client{
public static void description(Animal animal){
String desc = "This animal is called "+animal.getName();
desc +="\n Its meat is "+animal.getMeat();
desc +="\n And it has "+animal.getLegs()+" legs.";
System.out.println(desc);
}
public static void main(String[] args){
String aName = "chicken";
Director d = new Director();
Animal animal =d.getAnimal(aName);
description(animal);
aName = "pig";
animal = d.getAnimal(aName);
description(animal);
}
}
结论:生成器模式使得客户可以更加精细的控制一个对象的构建,每个具体的创建者包含了创建和装配一个特定产品的所有代码,这些代码只用写一次,便可以被不同的Director使用,从而可以装配出不同的对象。