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