建造者模式--在工地做过的人都懂

定义
建造者模式又称生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这样我们使用建造者模式,用户只需要指定需要建造的类型,而具体创建过程可以创建不同的表示。
情形
今天周末,家兴的球瘾发作了,约了小榕和小亮去打球.三人去到篮球场,随便找了一个场地热身,然后大家就开打球,他们三个一队,然后对手是另外三个年轻人.一开始,家兴他们那队打得还行,但是还是被虐,对手不单单投球很准而且体能非常充足,是典型的地板流球员,几场下来家兴他们已经吃不消了,暂停十分钟,家兴走过去对手哪里,怎么你们一个个投也差不多,打球的动作也差不多,体能也都非常好,基础非常扎实的.对手老王就说了,我们三以前可是受了训练的,我们一开始天天都是在练体能,然后才能去运球,再到传球,接着投球,我们都是按照这个流程去训练的,和你们没有系统练球,整天在野球场上打球当然不一样.家兴听到对方这么嚣张有点不爽,就说我们继续打吧,想逞强打爆他们.接下来还是被虐得差点连妈都不认识…….
家兴睡在床上想了一下,看来打篮球都是要按流程去训练才行,这样基础才能扎实,这样子我的技术才没有那么烂.哎哟,这不是和我之前学的建造者模式同一个意思么.看来这个模式也是适用篮球呀,哈哈哈…

结构
Builder:抽象构造者。为创建一个Product对象各个部件指定的接口。
ConcreteBuilder:具体构造者。实现抽象构造者Builder,构建和装配产品的各个部件。做具体的建造者工作,却不为客户端所知。
Product:产品,被构建的复杂对象。具体建造者创建该产品的内部并表示定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终的产品接口。
Director:指挥者。构建一个使用抽象建造者Builder的对象。它与客户端打交道,将客户端创建的产品的请求划分为对各个零件的建造请求,再将请求委派给ConcreteBuilder。

建造者模式xml图
这里写图片描述

代码:

//接口
public interface Process {
    //体能锻炼,练基础
    public void physicalTraining();
    //运球
    public void dribble();
    //传球
    public void pass();
    //投球
    public void bat();
    //返回我一个篮球运动员
    Basketballer retrieveResult();
}
//具体实现类A
public class ConreteProcessA implements Process{

    private Basketballer basketballer = new Basketballer();
    @Override
    public void physicalTraining() {
        // TODO Auto-generated method stub
        basketballer.setTarning("家兴:我可是每天很勤奋的跑步做很多基础锻炼的,做力量训练!");

    }

    @Override
    public void dribble() {
        // TODO Auto-generated method stub
        basketballer.setDrible("家兴:我每天都会在篮球场上运球三个小时!");
    }

    @Override
    public void pass() {
        // TODO Auto-generated method stub
        basketballer.setPassBall("家兴:我不喜欢传球,但是我每天还是也和队友训练传球,但是这个不是我强项!");
    }

    @Override
    public void bat() {
        // TODO Auto-generated method stub
        basketballer.setBall("家兴:我非常喜欢篮球直接刷一声网框,很干脆,所以我每天都会练投球,每天至少投五百个球。");
    }

    @Override
    public Basketballer retrieveResult() {
        // TODO Auto-generated method stub
        return basketballer;
    }

}

//具体实现类B
public class ConreteProcessB implements Process{

    private Basketballer basketballer = new Basketballer();
    @Override
    public void physicalTraining() {
        // TODO Auto-generated method stub
        basketballer.setTarning("小榕:我每天都坚持锻炼几个小时的体能锻炼,所以我的体能非常好。/n");
    }

    @Override
    public void dribble() {
        // TODO Auto-generated method stub
        basketballer.setDrible("小榕:我长得比较高,所以我运球不好,在运球这些方面上我需要花更多时间去练习!/n");
    }

    @Override
    public void pass() {
        // TODO Auto-generated method stub
        basketballer.setPassBall("小榕:我经常看NBA那些传球,学习他们的传球方式,所以我传球的效率比较高。/n");
    }

    @Override
    public void bat() {
        // TODO Auto-generated method stub
        basketballer.setBall("小榕:我投球的感觉不好,所以我一般都是练练勾手的,很少练远投,中投!/n");
    }

    @Override
    public Basketballer retrieveResult() {
        // TODO Auto-generated method stub
        return basketballer;
    }

}

指挥者

//教练指导他们要这样训练
public class Coach {
    private Process process;
    public Coach(Process process){
        this.process = process;
    }
    public void construct(){
        process.physicalTraining();
        process.dribble();
        process.pass();
        process.bat();
    }

}

产品

//Basketballer 
public class Basketballer {
    private String tarning;
    private String drible;
    private String passBall;
    private String ball;
    public String getTarning() {
        return tarning;
    }
    public void setTarning(String tarning) {
        this.tarning = tarning;
    }
    public String getDrible() {
        return drible;
    }
    public void setDrible(String drible) {
        this.drible = drible;
    }
    public String getPassBall() {
        return passBall;
    }
    public void setPassBall(String passBall) {
        this.passBall = passBall;
    }
    public String getBall() {
        return ball;
    }
    public void setBall(String ball) {
        this.ball = ball;
    }
    @Override
    public String toString() {
        return "Basketballer [\n tarning=" + tarning + ",\n drible=" + drible
                + ",\n passBall=" + passBall + ",\n ball=" + ball + "]";
    }


}

客户端

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Process process= new ConreteProcessA();
//      Process process= new ConreteProcessB();
        Coach coach = new Coach(process);
        coach.construct();
        Basketballer basketballer = process.retrieveResult();
        System.out.println(basketballer.toString());

    }

}

输出效果
Basketballer [
tarning=家兴:我可是每天很勤奋的跑步做很多基础锻炼的,做力量训练!,
drible=家兴:我每天都会在篮球场上运球三个小时!,
passBall=家兴:我不喜欢传球,但是我每天还是也和队友训练传球,但是这个不是我强项!,
ball=家兴:我非常喜欢篮球直接刷一声网框,很干脆,所以我每天都会练投球,每天至少投五百个球。]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值