码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式之建造者模式

时间:2016-05-06 15:38:30      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

一.定义背景

     原始的定义是: 将一个复杂产品的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。(构建和标示相分离)单纯的从字面意思来理解的话还是不太好理解。复杂的构建过程基本是一样的,表示的时候将其分离出来,可以出现多种分支。比如中国移动的套餐类型:同样是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中如果还有第三种套餐的话,也是很容易扩展的。无需修改其他的东西。这个就是封装。
























Java设计模式之建造者模式

标签:

原文地址:http://blog.csdn.net/cn_wanny/article/details/51316998

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!