设计模式之建造者模式

1、核心本质:

-分离了对象子组件的单独构造(有Builder来负责)和装配(有Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
-由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

2、应用场景

-StringBuilder类的append方法
-SQL中的preparedStatement
-JDOM中,DomBuilder、SAXBuilder

3、优点

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

4、代码示例

问题:一个汽车由发动机、车身、底盘组成,如何建造一个汽车呢?
建造者模式

/**
 * 汽车类
 * @author ly1
 *
 */
public class Car {
    private Engine engine;  //引擎
    private Wheel wheel;    //车轮    
    private Chassis chassis;    //底盘
    public Car(Engine engine, Wheel wheel, Chassis chassis) {
        super();
        this.engine = engine;
        this.wheel = wheel;
        this.chassis = chassis;
    }
    public Engine getEngine() {
        return engine;
    }
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
    public Wheel getWheel() {
        return wheel;
    }
    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }
    public Chassis getChassis() {
        return chassis;
    }
    public void setChassis(Chassis chassis) {
        this.chassis = chassis;
    }


}

/**
 * 发动机类
 * @author ly1
 *
 */
class Engine{
    private String name;


    public Engine(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/**
 * 车轮类
 * @author ly1
 *
 */
class Wheel{
    private String name;

    public Wheel(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

/**
 * 底盘类
 * @author ly1
 *
 */
class Chassis{
    private String name;

    public Chassis(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
/**
 * 建造者接口
 * @author ly1
 *
 */
public interface Builder {
    Engine createEngine();
    Wheel createWheel();
    Chassis createChassis();
}
/**
 * 建造者接口实现类:AudiBuilder
 * @author ly1
 *
 */
public class AudiBuilder implements Builder{

    @Override
    public Engine createEngine() {
        System.out.println("发动机建造中...");
        return new Engine("奥迪");
    }

    @Override
    public Wheel createWheel() {
        System.out.println("车轮建造中...");
        return new Wheel("奥迪");
    }

    @Override
    public Chassis createChassis() {
        System.out.println("底盘建造中...");
        return new Chassis("奥迪");
    }

}
/**
 * 组装接口
 * @author ly1
 *
 */
public interface Director {
    Car create();
}
/**
 * 组装接口实现类:AudiDirector
 * @author ly1
 *
 */
public class AudiDirector implements Director{

    private Builder builder;

    public AudiDirector(Builder builder) {
        this.builder = builder;
    }

    @Override
    public Car create() {
        Engine e = builder.createEngine();
        Wheel w = builder.createWheel();
        Chassis c = builder.createChassis();

        return new Car(e,w,c);
    }

}
/**
 * 客户端调用
 * @author ly1
 *
 */
public class Client {
    public static void main(String[] args) {
        Builder builder = new AudiBuilder();
        Director director = new AudiDirector(builder);
        Car car = director.create();

        Engine engine = car.getEngine();
        System.out.println(engine.getName());
    }
}

结果:
发动机建造中...
车轮建造中...
底盘建造中...
奥迪
5、扩展

-如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者。
-在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色(在Builder中用一个方法完成组装)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值