一、引言
每天进步一点点,每天快乐一点点。坚持每天写点东西,感觉很好,既复习基础知识,又可以收获一份成就感,何乐而不为呢?设计模式是一个菜鸟成为一个高手必须要掌握的东西,因此我们今天的话题就是设计模式之建造者模式。
二、什么是建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
三、建造者模式类图
类图是一个很重要的理解设计模式的工具,因此必须很好的理解。
四、建造者模式中的角色
1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
3、Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
4、Product:复杂对象。也是被建造的对象
五、举例说明
工程结构图:
AbstractCar.java
package designModeBulder;
//抽象产品类
public abstract class AbstractCar {
abstract public void seat();//建造座位
abstract public void light();//建造灯光
abstract public void wheel();//建造轮子
abstract public void engine();//建造发动机
//默认流程
public void defaultCar(){
seat();
light();
wheel();
engine();
}
}
BenchiCar.java
package designModeBulder;
public class BenChiCar extends AbstractCar{
@Override
public void seat() {
// TODO Auto-generated method stub
System.out.println("奔驰车建造了座椅");
}
@Override
public void light() {
// TODO Auto-generated method stub
System.out.println("奔驰车建造了灯光");
}
@Override
public void wheel() {
// TODO Auto-generated method stub
System.out.println("奔驰车建造了轮子");
}
@Override
public void engine() {
// TODO Auto-generated method stub
System.out.println("奔驰车建造了发动机");
}
}
BmwCar.java
package designModeBulder;
public class BmwCar extends AbstractCar {
@Override
public void seat() {
// TODO Auto-generated method stub
System.out.println("宝马建造了座位");
}
@Override
public void light() {
// TODO Auto-generated method stub
System.out.println("宝马建造了灯光");
}
@Override
public void wheel() {
// TODO Auto-generated method stub
System.out.println("宝马建造了轮子");
}
@Override
public void engine() {
// TODO Auto-generated method stub
System.out.println("宝马建造了发动机");
}
}
ICarBuilder.java
package designModeBulder;
//抽象建造者
public interface ICarBuilder {
public void buildCar();
public AbstractCar getCar();
}
BenchiCarBuilder.java
package designModeBulder;
public class BenChiCarBuilder implements ICarBuilder {
BenChiCar benChiCar=new BenChiCar();//先创建一辆空白的奔驰车
@Override
public void buildCar() {
// TODO Auto-generated method stub
benChiCar.wheel();//先建造轮子
benChiCar.engine();//再造发动机
benChiCar.light();//造灯光
benChiCar.seat();//建造座位
}
@Override
public AbstractCar getCar() {
// TODO Auto-generated method stub
return this.benChiCar;//建好了一辆奔驰
}
}
BmwCarBuilder.java
package designModeBulder;
public class BmwCarBuilder implements ICarBuilder{
BmwCar bmwCar = new BmwCar();
@Override
public void buildCar() {
// TODO Auto-generated method stub
bmwCar.wheel();
bmwCar.engine();
bmwCar.seat();
bmwCar.light();
}
@Override
public AbstractCar getCar() {
// TODO Auto-generated method stub
return this.bmwCar;
}
}
CarDirector.java
package designModeBulder;
//导演类角色
public class CarDerictor {
BenChiCarBuilder benChiCarBuilder = new BenChiCarBuilder();//拥有建造奔驰车的师傅
BmwCarBuilder bmwCarBuilder= new BmwCarBuilder();//拥有建造宝马车的师傅
public AbstractCar getbenCar() {
benChiCarBuilder.buildCar();
return benChiCarBuilder.getCar();
}
public AbstractCar getBmaCar(){
bmwCarBuilder.buildCar();
return bmwCarBuilder.getCar();
}
}
BuilderTest.java
package designModeBulder;
public class BuidlerTest {
public static void main(String args[]){
CarDerictor carDerictor = new CarDerictor();
BenChiCar benChiCar =(BenChiCar)carDerictor.getbenCar();
BmwCar bmwCar = (BmwCar)carDerictor.getBmaCar();
}
}
运行结果:
奔驰车建造了轮子
奔驰车建造了发动机
奔驰车建造了灯光
奔驰车建造了座椅
宝马建造了轮子
宝马建造了发动机
宝马建造了座位
宝马建造了灯光
六、总结
使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是AbstractCar.建造者之间是相互独立的,易于扩展。其适用场景:相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式;产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。
一篇很不错的文章可以参考这里。