Java学习笔记---设计模式之建造者模式(一)

一、引言

        每天进步一点点,每天快乐一点点。坚持每天写点东西,感觉很好,既复习基础知识,又可以收获一份成就感,何乐而不为呢?设计模式是一个菜鸟成为一个高手必须要掌握的东西,因此我们今天的话题就是设计模式之建造者模式。

二、什么是建造者模式

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

三、建造者模式类图

         类图是一个很重要的理解设计模式的工具,因此必须很好的理解

         

四、建造者模式中的角色

          1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
          2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
          3、Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
          4、Product:复杂对象。也是被建造的对象

五、举例说明

工程结构图:


AbstractCar.java

package designModeBulder;

//抽象产品类
public abstract class AbstractCar {

	abstract public void seat();//建造座位
	
	abstract public void light();//建造灯光
	
	abstract public void wheel();//建造轮子
	
	abstract public void engine();//建造发动机
	
	//默认流程
	public void defaultCar(){
		seat();
		light();
		wheel();
		engine();
	}
}
BenchiCar.java

package designModeBulder;

public class BenChiCar extends AbstractCar{

	@Override
	public void seat() {
		// TODO Auto-generated method stub
		System.out.println("奔驰车建造了座椅");
	}

	@Override
	public void light() {
		// TODO Auto-generated method stub
		System.out.println("奔驰车建造了灯光");
	}

	@Override
	public void wheel() {
		// TODO Auto-generated method stub
		System.out.println("奔驰车建造了轮子");
	}

	@Override
	public void engine() {
		// TODO Auto-generated method stub
		System.out.println("奔驰车建造了发动机");
	}

	

	
}
BmwCar.java

package designModeBulder;

public class BmwCar extends AbstractCar {

	@Override
	public void seat() {
		// TODO Auto-generated method stub
		System.out.println("宝马建造了座位");
	}

	@Override
	public void light() {
		// TODO Auto-generated method stub
		System.out.println("宝马建造了灯光");
	}

	@Override
	public void wheel() {
		// TODO Auto-generated method stub
		System.out.println("宝马建造了轮子");
	}

	@Override
	public void engine() {
		// TODO Auto-generated method stub
		System.out.println("宝马建造了发动机");
	}

	
}
ICarBuilder.java

package designModeBulder;

//抽象建造者
public interface ICarBuilder {

	public void buildCar();
	
	public AbstractCar getCar();
}
BenchiCarBuilder.java

package designModeBulder;

public class BenChiCarBuilder implements ICarBuilder {

	BenChiCar benChiCar=new BenChiCar();//先创建一辆空白的奔驰车
	@Override
	public void buildCar() {
		// TODO Auto-generated method stub
		benChiCar.wheel();//先建造轮子
		benChiCar.engine();//再造发动机
		benChiCar.light();//造灯光
		benChiCar.seat();//建造座位
	}

	@Override
	public AbstractCar getCar() {
		// TODO Auto-generated method stub
		return this.benChiCar;//建好了一辆奔驰
	}

	
}
BmwCarBuilder.java

package designModeBulder;

public class BmwCarBuilder implements ICarBuilder{

	BmwCar bmwCar = new BmwCar();
	@Override
	public void buildCar() {
		// TODO Auto-generated method stub
		bmwCar.wheel();
		bmwCar.engine();
		bmwCar.seat();
		bmwCar.light();
	}

	@Override
	public AbstractCar getCar() {
		// TODO Auto-generated method stub
		return this.bmwCar;
	}
	
	
}
CarDirector.java

package designModeBulder;

//导演类角色
public class CarDerictor {

	BenChiCarBuilder benChiCarBuilder = new BenChiCarBuilder();//拥有建造奔驰车的师傅
	
	BmwCarBuilder bmwCarBuilder= new BmwCarBuilder();//拥有建造宝马车的师傅
	
	public AbstractCar getbenCar() {
		benChiCarBuilder.buildCar();
		
		return benChiCarBuilder.getCar();
	}
	
	public AbstractCar getBmaCar(){
		bmwCarBuilder.buildCar();
		
		return bmwCarBuilder.getCar();
		
	}
}
BuilderTest.java

package designModeBulder;

public class BuidlerTest {

	public static void main(String args[]){
		
		CarDerictor carDerictor = new CarDerictor();
		
		BenChiCar benChiCar =(BenChiCar)carDerictor.getbenCar();
		
		BmwCar bmwCar = (BmwCar)carDerictor.getBmaCar();
	}
}

运行结果:

奔驰车建造了轮子
奔驰车建造了发动机
奔驰车建造了灯光
奔驰车建造了座椅
宝马建造了轮子
宝马建造了发动机
宝马建造了座位
宝马建造了灯光

六、总结

         使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是AbstractCar.建造者之间是相互独立的,易于扩展。其适用场景:相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式;产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。

一篇很不错的文章可以参考这里








评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值