模式名 | 生成器模式/建造模式 Builder |
---|---|
定义 | 是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 |
实例 | 拼装一辆Car的动作可以分离成几个步骤 |
参与者 | Builder(抽象Builder) 为创建一个Product对象的各个部件指定抽象接口。 ConcreteBuilder(具体Builder) 实现Builder的接口以构造和装配该产品的各个部件。 定义并明确它所创建的表示。 提供一个检索产品的接口 Director(组装者) 构造一个使用Builder接口的对象。 Product(被组装的产品) 表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。 |
协作 | 客户创建Director对象,并用它所想要的Builder对象进行配置。 · 一旦产品部件被生成,Director导向器就会通知生成器。 · 生成器处理导向器的请求,并将部件添加到该产品中。 · 客户从生成器中检索产品。 |
适用场景 | · 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时; · 当构造过程必须允许被构造的对象有不同的表示时。 |
结构层次 |
|
优点 | · 它使你可以改变一个产品的内部表示 · 它将构造代码和表示代码分开 · 它使你可对构造过程进行更精细的控制 |
局限性 | · 装配和构造接口 生成器逐步的构造它们的产品。因此生成器接口必须足够普遍,以便为各种类型的具体生成器构造产品。 · 没有抽象类 通常情况下,由具体生成器生成的产品,它们的表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。 · 在生成器中默认的方法为空 定义为空方法可以使客户只重定义他们所感兴趣的操作。 |
实体产品类:
package com.freestudio.designpattern;
/**
* Builder模式:产品类
*
* @author antony
*
*/
public class Car
{
String mWheel;// 轮子
String mEngine;// 发动机
String mSteeringWheel;// 方向盘
void setWheel(String wheel)
{
mWheel = wheel;
}
void setEngine(String engine)
{
mEngine = engine;
}
void setSteeringWheel(String steeringWheel)
{
mSteeringWheel = steeringWheel;
}
public void printCarInfo()
{
System.out.println("Car:wheel is " + mWheel + ",Engine is " + mEngine
+ ",SteeringWheel is " + mSteeringWheel);
}
}
抽象builder
package com.freestudio.designpattern;
public abstract class CarBuilder
{
protected Car mCar;// 提供给具体类调用
public Car getCar()
{
return mCar;
}
public void createCar()
{
mCar = new Car();
}
// 构建轮子
public abstract void buildWheel();
// 构建发动机
public abstract void buildEngine();
// 构建方向盘
public abstract void buildSteeringWheel();
}
具体builder
package com.freestudio.designpattern;
//具体生成器
public class FordCarBuilder extends CarBuilder
{
@Override
public void buildWheel()
{
// TODO Auto-generated method stub
mCar.setWheel("ford wheel");
}
@Override
public void buildEngine()
{
// TODO Auto-generated method stub
mCar.setEngine("ford engine");
}
@Override
public void buildSteeringWheel()
{
// TODO Auto-generated method stub
mCar.setSteeringWheel("ford steeringWheel");
}
}
package com.freestudio.designpattern;
//具体生成器
public class SkodaCarBuilder extends CarBuilder
{
@Override
public void buildWheel()
{
// TODO Auto-generated method stub
mCar.setWheel("skoda wheel");
}
@Override
public void buildEngine()
{
// TODO Auto-generated method stub
mCar.setEngine("skoda engine");
}
@Override
public void buildSteeringWheel()
{
// TODO Auto-generated method stub
mCar.setSteeringWheel("skoda steeringWheel");
}
}
测试代码:
package com.freestudio.designpattern;
public class Main
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
TestBuilder();
// TestPrototype();
// TestFactory();
// TestSingleTon();
}
static void TestBuilder()
{
SkodaCarBuilder skoda = new SkodaCarBuilder();
FordCarBuilder ford = new FordCarBuilder();
Operator op = new Operator();
// 构建第一辆car
op.setCarBuilder(skoda);
op.constructCar();
Car car = op.getCar();
car.printCarInfo();
// 构建第二辆car
op.setCarBuilder(ford);
op.constructCar();
car = op.getCar();
car.printCarInfo();
}
}
输出:
Car:wheel is skoda wheel,Engine is skoda engine,SteeringWheel is skoda steeringWheel
Car:wheel is ford wheel,Engine is ford engine,SteeringWheel is ford steeringWheel
参考: