当要创建一个复杂的对象,该对象包含几个组件,几个组件又需要分别创建时采用建造者模式(其中组件的创建也可以采用工厂模式创建)

图片来自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html
Demo
Builder
Director
最后是我们的Client
打印结果
- 主要角色
- Product被建造对象
- Components,Product的组件
- Director导演类,包含创建被建造对象的方法
- Builder类,负责创建所需的组件
- Client,持有具体的Builder,并调用Director创建Product
图片来自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html
Demo
public class MotoBike {
private Engine engine;
private Light light;
public void run(){
System.out.println("MotoBike with "+engine+" and "+light+" running");
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Light getLight() {
return light;
}
public void setLight(Light light) {
this.light = light;
}
//内部组件
public static class Engine{
private String brand;
public Engine(String brand) {
super();
this.brand = brand;
System.out.println("EngineBrand:"+brand);
}
@Override
public String toString() {
return "Engine [brand=" + brand + "]";
}
}
//内部组件
public static class Light{
private String brand;
public Light(String brand) {
super();
this.brand = brand;
System.out.println("LightBrand:"+brand);
}
@Override
public String toString() {
return "Light [brand=" + brand + "]";
}
}
}
Builder
public interface IMotoBikeBuilder {
Engine buildEngine();
Light buildLight();
}
public class MotoBikeBuilderImpl implements IMotoBikeBuilder{
@Override
public Engine buildEngine() {
// 可以结合工厂模式返回对象
return new Engine("MyEngine");
}
@Override
public Light buildLight() {
// 可以结合工厂模式返回对象
return new Light("MyLight");
}
}
Director
/**
* 用于指导拼装builder生产的零件过程,返回最终的复杂产品
* @author Administrator
*
*/
public interface Director {
public MotoBike directorMotoBike();
}
public class DirectorImpl implements Director{
private IMotoBikeBuilder motoBikeBuilder;
/**
* 客户根据需求传入具体的建造者,而此方法的方法参数为接口的形式,实现解耦
* @param motoBikeBuilder
*/
public DirectorImpl(IMotoBikeBuilder motoBikeBuilder) {
super();
this.motoBikeBuilder = motoBikeBuilder;
}
public MotoBike directorMotoBike(){
Engine engine = motoBikeBuilder.buildEngine();
Light light = motoBikeBuilder.buildLight();
//产品的构建需要Builder生产出来的零件
MotoBike motoBike = new MotoBike();
motoBike.setEngine(engine);
motoBike.setLight(light);
return motoBike;
}
}
最后是我们的Client
public class Client {
public static void main(String[] args) {
//面向接口
Director director = new DirectorImpl(new MotoBikeBuilderImpl());
MotoBike motoBike = director.directorMotoBike();
motoBike.run();
}
}
打印结果
EngineBrand:MyEngine
LightBrand:MyLight
MotoBike with Engine [brand=MyEngine] and Light [brand=MyLight] running