[设计模式] - No.3 建造者模式

今天学习了设计模式中的建造者模式(Builder Pattern),这个模式也是属于四种设计模式中的创建型模式,四种模式如下所示:



建造者模式结构图如下:


在建造者模式中,我们需要用到四种角色:

1. Director:指挥者,根据用户需求来构建小人对象

2. Builder:建造者接口,用于创造Product各个部件指定的接口。内含建造Product的方法

3. ConcretedBuilder:实现Builder接口,用于构造和装配各个部件

4. Product:具体产品

总结构建者模式:将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示。

下面我们就以建造汽车的例子来示范一下建造者模式:


Car代码:

/**
 * Created by YanMing on 2017/5/20.
 */
public class Car {
    public String wheel;
    public String body;
    public String brand;
    public void setCarWheel(String wheel){
        this.wheel = wheel;
    }
    public void setCarBody(String body){
        this.body = body;
    }

    public void setCarBrand(String brand){
        this.brand = brand;
    }
    public void showMyCar(){
        System.out.println("Brand: " + this.brand +"\n"+
                            "Body: " + this.body +"\n" +
                            "Wheel: " + this.wheel + "\n");
    }
}
Builer 接口:

/**
 * Created by YanMing on 2017/5/20.
 */
public interface CarBuilder {
    public void BuildeCarWheel();
    public void BuildeCarBody();
    public void BuildeCarBrand();
    public Car FinishBuild();
}
BenzBuilder 代码:(FordBuilder省略)

/**
 * Created by YanMing on 2017/5/20.
 */
public class BenzBuilder implements CarBuilder {

    Car benz = new Car();

    @Override
    public void BuildeCarWheel() {
        System.out.println("Benz Wheel building!");
        benz.setCarWheel("Benz Wheel");
    }

    @Override
    public void BuildeCarBody() {
        System.out.println("Benz Body building!");
        benz.setCarBody("Benz Body");
    }

    @Override
    public void BuildeCarBrand() {
        System.out.println("Benz Brand building!");
        benz.setCarBrand("Benz Brand");
    }

    @Override
    public Car FinishBuild() {
        return benz;
    }
}
Director代码:

/**
 * Created by YanMing on 2017/5/20.
 */
public class CarDirector {
    public void Construct(CarBuilder cb){
        cb.BuildeCarBrand();
        cb.BuildeCarBody();
        cb.BuildeCarWheel();
    }
}

在主类中调用代码:

/**
 * Created by YanMing on 2017/5/20.
 */
public class BuilderPattern {
    public static void main(String arrgs []){
        CarDirector director = new CarDirector();
        BenzBuilder benzBuilder = new BenzBuilder();
        FordBuilder fordBuilder = new FordBuilder();

        director.Construct(benzBuilder);

        Car benz = benzBuilder.FinishBuild();
        benz.showMyCar();
    }
}
运行结果:



小思考:在我看来,建造者模式,每次只能返回一个对象。并且由于返回的对象和建造者模式是耦合的,如果我们想要多个Product对象,就必须实现Product类的Deep Copy。所以,我想能否将建造者函数内部的Product 改为传参,然后对引用对象进行加工呢?

就好像去饭店自带食材,因为厨师只有一份食材哈哈~

本文GitHub源码下载


P.S.文章不妥之处还望指正





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值