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

来源:互联网 发布:linux anaconda 安装 编辑:程序博客网 时间:2024/05/17 06:55

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

结构
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();}
//具体实现类Apublic 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;    }}//具体实现类Bpublic 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
原创粉丝点击