Java设计模式之建造者模式

一.定义背景

      原始的定义是: 将一个复杂产品的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。(构建和标示相分离)单纯的从字面意思来理解的话还是不太好理解。复杂的构建过程基本是一样的,表示的时候将其分离出来,可以出现多种分支。比如中国移动的套餐类型:同样是58元档次的,有二种套餐供选择:第一种:本地免费通话100分钟,流量500M,短信:20条,本地定向流量15G;第二种:本地免费通话50分钟,流量700M,短信:10条,本地定向流量5G;这种的话就会在显示的时候有二种套餐可供选择,提供给客户的就是二种表示,构造的过程你无需了解。这样就使得构建和表示相分离。

二.结构图


这个流程图中,产品product,分A套餐和B套餐二种继承自产品类,a套餐的具体实现来实现A套餐属性的设置,B套餐的具体实现b套餐的属性的设置。建造者会创建对应的对象。将表示提供给我们直接用。

三.源代码

product类
<span style="font-family:Courier New;font-size:18px;">public class MobileProduct {
	private String 流量;
	private  String 通话;
	private String 短信;
	private String 定向流量;
	public String get流量() {
		return 流量;
	}
	public void set流量(String 流量) {
		this.流量 = 流量;
	}
	public String get通话() {
		return 通话;
	}
	public void set通话(String 通话) {
		this.通话 = 通话;
	}
	public String get短信() {
		return 短信;
	}
	public void set短信(String 短信) {
		this.短信 = 短信;
	}
	public String get定向流量() {
		return 定向流量;
	}
	public void set定向流量(String 定向流量) {
		this.定向流量 = 定向流量;
	}
}</span>
套餐1
<span style="font-family:Courier New;font-size:18px;">public class One58 extends MobileProduct {

}</span>
套餐2
<span style="font-family:Courier New;font-size:18px;">public class Two58 extends MobileProduct{

}</span>
建造者bulider


public interface Bulider {
	public void bulid流量();
	public void bulid通话();
	public void bulid短信();
	public void bulid定向流量();
	public MobileProduct getProduct();

}
实现套餐1的构造

<span style="font-family:Courier New;font-size:18px;">public class One58Impl implements Bulider{

	
	private MobileProduct product ;
	public One58Impl(){
 	 product = new One58();
	}
	public void bulid流量() {
		// TODO Auto-generated method stub
		product.set流量("套餐一:500M");
	}

	public void bulid通话() {
		// TODO Auto-generated method stub
		product.set通话("套餐一:100分钟");
	}

	public void bulid短信() {
		// TODO Auto-generated method stub
		product.set短信("套餐一:20条");
	}

	public void bulid定向流量() {
		// TODO Auto-generated method stub
		product.set定向流量("套餐一:15G");
	}

	public MobileProduct getProduct() {
		// TODO Auto-generated method stub
		return product;
	}</span>

实现套餐2的构造

<span style="font-family:Courier New;font-size:18px;">public class Two58Impl implements Bulider{

	private MobileProduct product;
	
	public Two58Impl(){
		product = new Two58();
	}
	public void bulid流量() {
		// TODO Auto-generated method stub
		product.set流量("套餐二:700M");
	}

	public void bulid通话() {
		// TODO Auto-generated method stub
		product.set通话("套餐二:50分钟");
	}

	public void bulid短信() {
		// TODO Auto-generated method stub
		product.set短信("套餐二:10条");
	}

	public void bulid定向流量() {
		// TODO Auto-generated method stub
		product.set定向流量("套餐二:5G");
	}

	public MobileProduct getProduct() {
		// TODO Auto-generated method stub
		return product;
	}</span>

Director类

<span style="font-family:Courier New;font-size:18px;">public class Director {
	
	public MobileProduct getProduct(Bulider bulid){
		bulid.bulid定向流量();
		bulid.bulid流量();
		bulid.bulid短信();
		bulid.bulid通话();
		return bulid.getProduct();
	}
}</span>
测试代码
<span style="font-family:Courier New;font-size:18px;">public class Test {
	
	public static void main(String[] args) {
		Director director = new Director();
		Bulider bulid = new One58Impl();
		MobileProduct product = director.getProduct(bulid);
		System.out.println("套餐一的详情:");
		System.out.println(product.get定向流量());
		System.out.println(product.get流量());
		System.out.println(product.get短信());
		System.out.println(product.get通话());
		bulid = new Two58Impl();
		product = director.getProduct(bulid);
		System.out.println("套餐二的详情:");
		System.out.println(product.get定向流量());
		System.out.println(product.get流量());
		System.out.println(product.get短信());
		System.out.println(product.get通话());
	}

}</span>
//结果
<span style="font-family:Courier New;font-size:18px;">套餐一的详情:
套餐一:15G
套餐一:500M
套餐一:20条
套餐一:100分钟
套餐二的详情:
套餐二:5G
套餐二:700M
套餐二:10条
套餐二:50分钟</span>

四.总结

   1. 一个部分是Builder接口,这里是定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何装配这些部件到产品中去;

  2. 另外一个部分是Director,Director是知道如何组合来构建产品,也就是说Director负责整体的构建算法,而且通常是分步骤地来执行。

  不管如何变化,建造模式都存在这么两个部分,一个部分是部件构造和产品装配,另一个部分是整体构建的算法。认识这点是很重要的,因为在建造模式中,强调的是固定整体构建的算法,而灵活扩展和切换部件的具体构造和产品装配的方式。

  再直白点说,建造模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用。具体的构造实现可以很方便地扩展和切换,从而可以灵活地组合来构造出不同的产品对象。

Bulider和Director这二个是固定的东西。其余的都是业务的扩展。上面的demo中如果还有第三种套餐的话,也是很容易扩展的。无需修改其他的东西。这个就是封装。
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值