您的位置:首页 > 编程语言 > Java开发

个人对设计模式的理解-->建造者模式

2016-04-18 19:55 363 查看
概念:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

对于概念,有点抽象,不是很容易理解。下面举个例子关于个人对建造者模式的理解。

   比如奶茶店,会卖各种口味的奶茶和饮料,比如有红豆味,原味的,巧克力的,而制作奶茶的步骤都是类似,先放原料,再加糖,再加开水,小型的奶茶店,这些操作

由一个奶茶mm负责完成。大型的奶茶店,有负责各种口味的奶茶mm,我们去买奶茶,只需要告诉收银员要什么口味的并且付完钱。builder模式就是为了将做奶茶所需的原料和

过程分开,奶茶mm即是建造者。

代码如下:

<pre name="code" class="java">package com.tc.gof.builder;
/**
* 抽象类奶茶 需要实现三个步骤才能完成 放原料、加糖、加开水
*
*/
public abstract class Tea {
// 第一步 加原料
protected abstract void addMaterial();
// 第二步 加糖
protected abstract void addSugar();
// 第三步 加开水
protected abstract void addWater();

/**
* 默认步骤
* @return
*/
public final Tea defaultTea(){
addMaterial();
addSugar();
addWater();
return this;
}
}



package com.tc.gof.builder;

/**
* 红豆味奶茶
*
*/
public class RedBeanTea extends Tea {

@Override
protected void addMaterial() {
System.out.println("加红豆");
}

@Override
protected void addSugar() {
System.out.println("加糖");
}

@Override
protected void addWater() {
System.out.println("加水");
}

}
package com.tc.gof.builder;
/**
*草莓味的奶茶
*
*/
public class StrawberryTea extends Tea {

@Override
protected void addMaterial() {
System.out.println("加草莓原料");
}

@Override
protected void addSugar() {
System.out.println("加糖");
}

@Override
protected void addWater() {
System.out.println("加水");
}

}
package com.tc.gof.builder;
/**
* 做红豆奶茶的mm
*
*/
public class RedBeanBuilder extends AbstractBuilder {

private Tea tea = new RedBeanTea();

@Override
public void buildPart() {
// 加原料
tea.addMaterial();
// 加糖
tea.addSugar();
// 加水
tea.addWater();
}

@Override
public Tea buildProduct() {
System.out.println("红豆味的做完");
return tea;
}

}
package com.tc.gof.builder;
/**
* 做草莓味奶茶的mm
*
*/
public class StrawberryBuilder extends AbstractBuilder {

private Tea tea = new StrawberryTea();

@Override
public void buildPart() {
// 加原料
tea.addMaterial();
// 加水 这里先加水
tea.addWater();
// 问顾客是否加糖
tea.addSugar();
}

@Override
public Tea buildProduct() {
System.out.println("草莓味的做完");
return tea;
}

}
package com.tc.gof.builder;
/**
* 收银员
*
*/
public class Cashier {
// 两名奶茶mm
private AbstractBuilder redBeanBuilder = new RedBeanBuilder();
private AbstractBuilder strawberryBuilder = new StrawberryBuilder();

/**
* 购买红豆味的
* @return
*/
public Tea getRedBeanTea(){
redBeanBuilder.buildPart();
return redBeanBuilder.buildProduct();
}

/**
* 购买草莓味的
* @return
*/
public Tea getStrawberryTea(){
strawberryBuilder.buildPart();
return strawberryBuilder.buildProduct();
}

}
package com.tc.gof.builder;

public class BuilderTest {
public static void main(String[] args) {
Cashier cashier = new Cashier();
System.out.println("=======购买红豆味的=======");
cashier.getRedBeanTea();
System.out.println("=======购买奶茶味的=======");
cashier.getStrawberryTea();
}
}


输出结果如下:

=======购买红豆味的=======

加红豆

加糖

加水

红豆味的做完

=======购买奶茶味的=======

加草莓原料

加水

加糖

草莓味的做完

总结:建造者模式是对工厂模式的扩展,工厂类提供了生产单个产品的功能,而建造者模式则可以将各个产品集中统一管理。

区别:   工厂模式关注的是整个产品。

建造者模式关注的是产品各组成部分的创建过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息