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

ⅰ亾dé卋堺 提交于 2019-11-27 04:47:05

概念:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

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

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

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

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

代码如下:

 

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(){
		<span style="line-height: 21.6px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">addMaterial</span><span style="line-height: 21.6px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">();</span>
		<span style="line-height: 21.6px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">addSugar</span><span style="line-height: 21.6px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">();</span>
		<span style="line-height: 21.6px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">addWater</span><span style="line-height: 21.6px; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;">();</span>
		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();
	}
}


输出结果如下:

 

 

 

=======购买红豆味的=======
加红豆
加糖
加水
红豆味的做完
=======购买奶茶味的=======
加草莓原料
加水
加糖
草莓味的做完

 

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

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

建造者模式关注的是产品各组成部分的创建过程。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!