设计模式之-----建造者模式

今天学习了建造者模式,所谓建造者,就是将步骤一样,但是具体内容不一样的方法封装起来。我个人感觉和工厂模式有些相似之处。

首先举个例子,汽车生产的时候,不管什么汽车,组装的步骤,方式,大体上都是一样的,从这个角度来看,宝马汽车和奇瑞QQ就是一样的,他们都是汽车,区别就在于他们的用料,以及具体细节的不同,我们就用这个为例子。我不在过多的解释了,代码里有注释的。

首先看包结构


下边是具体代码:

car类,是所有汽车的抽象

package com.builder.product;

import java.util.ArrayList;
import java.util.List;

/**
 * 汽车的抽象类,封装了汽车都有的一些共同特征
 * @author ZHENGWEI
 * @date Jul 26, 2015
 */
public abstract class Car {

	private List<String> carList = new ArrayList<String>();
	
	/**
	 * 最后组装汽车要用的方法
	 * @param str
	 */
	public void add(String str){
		System.out.println("为汽车新增了:"+str);
		carList.add(str);
	}
	
	/**
	 * 显示汽车由哪些零件组成
	 */
	public void show(){
		for(String str : this.carList){
			System.out.println(str);
		}
	}
}

之后是具体的那个汽车

package com.builder.product;

public class BMW extends Car{

	private String str = "增加了宝马特有的安全刹车系统";
	
	public BMW(){
		super();
		super.add(this.str);
	}
}

package com.builder.product;

public class QQ extends Car{

	//这个就不要在意QQ有没有这个东西了,只是个例子
	private String str = "奇瑞QQ特有的安全刹车系统";
	
	public QQ(){
		super();
		super.add(this.str);
	}
}

下面是建造者了,先定义接口

package com.builder.builder;

import com.builder.product.Car;

/**
 * 建造者的接口,不管生产什么样子的汽车,这几个步骤是一定要有的
 * @author ZHENGWEI
 * @date Jul 26, 2015
 */
public interface IBuilder {

	/**
	 * 增加发动机,每个汽车都需要发动机
	 */
	public void addMotor();
	
	/**
	 * 增加方向盘
	 */
	public void addSteering();
	
	/**
	 * 增加车轮
	 */
	public void addTyre();
	
	/**
	 * 返回car的实例
	 * @return
	 */
	public Car getCar();
	
	//还有许多零件,这里就不一一列举了。。。
}

然后是两个具体实现类

package com.builder.builder;

import com.builder.product.BMW;
import com.builder.product.Car;

/**
 * 宝马的建造者
 * @author ZHENGWEI
 * @date Jul 26, 2015
 */
public class BMWBulider implements IBuilder {

	private BMW bmw = new BMW();
	
	public void addMotor() {
		bmw.add("宝马V8发动机,排量4.0");
	}

	public void addSteering() {
		bmw.add("宝马电动助力方向盘");
	}

	public void addTyre() {
		bmw.add("米其林轮胎,宝马专用版");
	}

	public Car getCar() {
		return bmw;
	}

}

package com.builder.builder;

import com.builder.product.Car;
import com.builder.product.QQ;

/**
 * QQ的建造者
 * @author ZHENGWEI
 * @date Jul 26, 2015
 */
public class QQBuilder implements IBuilder {

	private QQ qq = new QQ();
	
	public void addMotor() {
		qq.add("奇瑞QQ普通发动机,排量1.0");
	}

	public void addSteering() {
		qq.add("奇瑞QQ普通无助力方向盘");
	}

	public void addTyre() {
		qq.add("奇瑞QQ普通轮胎");
	}

	public Car getCar() {
		return qq;
	}

}

之后比较重要的就是导演类了,这个类负责全局的调用和指挥建造者

package com.builder.director;

import com.builder.builder.IBuilder;

public class Director {

	private IBuilder builder;
	
	/**
	 * 构造方法,传入该接口的实现,即具体的某个生产者
	 * @param builder
	 */
	public Director(IBuilder builder){
		this.builder = builder;
	}
	
	/**
	 * 开始组装,这里,每个汽车的组装方式,组装顺序都是一样的
	 */
	public void startAdd(){
		this.builder.addMotor();
		this.builder.addSteering();
		this.builder.addTyre();
	}
}

最后来一个测试类

package com.builder.main;

import com.builder.builder.BMWBulider;
import com.builder.builder.IBuilder;
import com.builder.builder.QQBuilder;
import com.builder.director.Director;
import com.builder.product.Car;

public class BuilderMain {

	public static void main(String[] args) {
		IBuilder bmwBuil = new BMWBulider();
		
		//宝马
		Director director = new Director(bmwBuil);
		director.startAdd();
		Car bmwCar = bmwBuil.getCar();
		bmwCar.show();
		
		IBuilder qqBuil = new QQBuilder();
		//QQ
		Director director1 = new Director(qqBuil);
		director.startAdd();
		Car qqCar = bmwBuil.getCar();
		qqCar.show();
	}

}

最后是结果


原则上来说,这个模式就是封装了不变的,区别的变化的,将变与不变分开,使结构更清晰。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值