引言
网上有很多介绍设计模式系列的优秀文章,看懂不一定是真懂,能写出来,说出个1、2、3点才算是真的懂了,如果能灵活的应用到工作中才算是真的熟练。
1、模式场景
汽车的构造是复杂的,整车包括车架、车轮、发动机等。消费者无需关心汽车的构造细节,只需告诉厂商想要奔驰还是宝马,提车的时候,就可以提取相应的车。
2、模式结构
1、Builder:抽象建造者 定义构造的类型和流程,对应模式场景中车的组装过程。 2、ConcreteBuilder:具体建造者 定义具体构造流程的实现,对应模式场景中奔驰车、宝马车组装过程。 3、Director:指挥者 定义选择哪个构造流程实现,对应模式场景中生产厂商。 4、Product:产品角色 定义是何种产品,对应模式场景中的车。
3、示例代码
3.1、抽象建造者
public abstract class CarBuild {
public Car car;
//建造车轮
public CarBuild buildWheel(){
return this;
}
//建造引擎
public CarBuild buildEngine(){
return this;
}
//建造车架
public CarBuild buildFrame(){
return this;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
3.2、具体建造者
//宝马车建造者
public class BmwCarBuild extends CarBuild {
public BmwCarBuild(){
this.car = new Car();
}
@Override
public CarBuild buildWheel() {
car.setWheel("Bmw wheel ...");
return this;
}
@Override
public CarBuild buildEngine() {
car.setEngine("Bmw engine ...");
return this;
}
@Override
public CarBuild buildFrame() {
car.setFrame("Bmw frame ...");
return this;
}
}
//奔驰车建造者
public class BenzCarBuild extends CarBuild {
public BenzCarBuild(){
this.car = new Car();
}
@Override
public CarBuild buildWheel() {
car.setWheel("Benz wheel ...");
return this;
}
@Override
public CarBuild buildEngine() {
car.setEngine("Benz engine ...");
return this;
}
@Override
public CarBuild buildFrame() {
car.setFrame("Benz frame ...");
return this;
}
}
3.3、指挥者
public class CarFactory {
private Car car;
public CarFactory(CarBuild carBuild) {
Car car = carBuild.buildWheel().buildEngine().buildFrame().getCar();
this.car = car;
}
public Car getCar() {
return car;
}
}
3.4、产品角色
public class Car {
//车轮
private String wheel;
//引擎
private String engine;
//车架
private String frame;
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
@Override
public String toString() {
return "Car{" +
"wheel='" + wheel + '\'' +
", engine='" + engine + '\'' +
", frame='" + frame + '\'' +
'}';
}
}
3.5、测试类
public class CarTest {
public static void main(String[] args) {
//构建一辆奔驰车
CarFactory benzFactory = new CarFactory(new BenzCarBuild());
Car benzCard = benzFactory.getCar();
System.out.println(benzCard.toString());
//构建一辆宝马车
CarFactory bmwFactory = new CarFactory(new BmwCarBuild());
Car bmwCard = bmwFactory.getCar();
System.out.println(bmwCard.toString());
}
}
控制台输出:
Car{wheel='Benz wheel ...', engine='Benz engine ...', frame='Benz frame ...'}
Car{wheel='Bmw wheel ...', engine='Bmw engine ...', frame='Bmw frame ...'}
4、模式优点
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 可以更加精细地控制产品的创建过程。
- 用户使用不同的建造者得到不同的对象,系统的扩展也方便。
5、模式缺点
- 有局限性,适用产品组成部分相似的,如果差异性很大则不适用。
结束语
建造者模式在很多游戏领域都有用到,玩游戏时候,根据不同关卡,会渲染不同地图,而地图的创建过程是固定的,使用建造者模式就非常合适。下一篇:设计模式——单例模式