建造者模式--在工地做过的人都懂
来源:互联网 发布: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=家兴:我非常喜欢篮球直接刷一声网框,很干脆,所以我每天都会练投球,每天至少投五百个球。]
- 建造者模式--在工地做过的人都懂
- 在effective java中看到的两个比较精妙的例子,一个是建造者模式,一个是装饰器模式,故在此做一下笔记
- java建造者模式在android上的实践
- 建造者模式的设计
- 建造者模式的实现
- Java建造者模式,Android建造者模式的AlertDialog
- 在Android中探秘建造者模式
- 在Android中探秘建造者模式
- 在工地上!
- 混在工地
- java的设计模式 建造者模式
- 【有毒的设计模式】建造者模式
- Android的设计模式-建造者模式
- 不老呢做草药--建造者(Builder)模式
- 看到过看哥哥的客观看看的这个工地开工快点
- 看到过看哥哥的客观看看的这个工地开工快点
- 工地的暮色
- 工地安装的几个问题
- [LeetCode]--217. Contains Duplicate
- Southern Subregion Problem F. Judging Time Prediction
- eclipse 环境下 FreeMarker 编辑器插件
- 字符串中有*,*可以用0和1替换,输出所有的字符串
- Coderforces 703B Mishka and trip
- 建造者模式--在工地做过的人都懂
- jtag烧掉了stm32
- Vacations
- 2570. 【NOIP2011模拟9.17】数字生成游戏 (StandardIO)
- studio下进行android单元测试
- merge sorted array 的总结
- Codeforces 583C/582A 暴力+gcd
- Southern Subregion Problem C. Equivalent Cards
- Mac终端中上传文件到Linux服务器