JAVA23种设计模式——建造者模式

本文主要讲一下建造者模式,因为其和工厂模式都是封装细节,只提供最终的成品,所以讲完建造者模式,再讲一下两种模式之间的异同,以及在什么环境下使用什么样的模式。
如果对工厂模式还不了解可以先看这篇文章:JAVA23种设计模式——工厂模式

一、建造者模式
建造者模式分三块内容(还是拿产品举例):

  • 产品本身(实体类)
  • 构建产品的标准(接口)和使用标准生产产品的车间(接口的实现类,具体生产什么产品每个车间都不同)
  • 导演类(指导各个车间进行工作并最终生产出成品)

用实际例子讲更清楚一些,举个造车的例子吧,虽然造车的例子被用的数不胜数…谁让它好理解呢。
车,由车身、车身颜色、四个轮子、发动机组成,然后我们写了个实体类:

public class Car {
	private String body;//车身
	private String color;//车身颜色
	private String wheel;//轮子
	private String engine;//引擎
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getWheel() {
		return wheel;
	}
	public void setWheel(String wheel) {
		this.wheel = wheel;
	}
	public String getEngine() {
		return engine;
	}
	public void setEngine(String engine) {
		this.engine = engine;
	}
}

想要建造的产品有了,接着我们要定一个行业标准,以后大家造车都用这个标准,所以我们写了个接口:

public interface CarStandard{
	public void buildBody();
	public void buildColor();
	public void buildWheel();
	public void buildEngine();
	public Car getCar();
}

行业造车标准出来了,我们按这个标准开设一条红色BMW跑车的流水线吧:

public class RedBMW implements CarStandard {
	Car car = new Car();
	@Override
	public void buildBody() {
		car.setBody("车身构建成型,流畅的车身弧线");
	}
	@Override
	public void buildColor() {
		car.setColor("炫丽的红色车漆喷漆完成");
	}
	@Override
	public void buildWheel() {
		car.setWheel("跑车专用轮胎装配完成");
	}
	@Override
	public void buildEngine() {
		car.setEngine("跑车的灵魂,引擎装备成功");
	}
	@Override
	public Car getCar() {
		return car;
	}
}

流水线也有了,让我们的车间主任(也就是大家说的director导演类)指导大家干活吧:

//具体怎么干,先装轮子还是先喷漆,都听车间主任的(指挥的艺术,所以叫director导演类)
public class Director {
	public Car creatCar(CarStandard entityCar){//指导大家干活流程的具体方法,括号里的参数是建造者模式的亮点,传入实现了造车标准的不同的流水线,主任可以指挥造不同的车
		entityCar.buildBody();
		entityCar.buildColor();
		entityCar.buildWheel();
		entityCar.buildEngine();
		System.out.println("车辆装配完成,可以驾驶");
		return entityCar.getCar();
	}
	public void showDetails(Car car){//造车流程细节展示(这个方法可有可无,为了丰富剧情和人物形象加了个细节展示)
		System.out.println(car.getBody());
		System.out.println(car.getColor());
		System.out.println(car.getWheel());
		System.out.println(car.getEngine());
	}
}

这时候厂长来了,找到车间主任说既然装好了一条流水线,你先造一辆来我开一下:

public class Test {
	public static void main(String[] args){
		Director director = new Director();//把车间主任叫来
		CarStandard redBMW = new RedBMW();//说要生产一台红色BMW跑车
		Car car = director.creatCar(redBMW);//车间主任接到任务就去让流水线造车了
		car.showDetails();//车间主任为了表明自己能干,还向厂长亲自展示了造车流程的细节
	}
}

细节展示:

车身构建成型,流畅的车身弧线
炫丽的红色车漆喷漆完成
跑车专用轮胎装配完成
跑车的灵魂,引擎装备成功
车辆装配完成,可以驾驶

厂长开完说好好好,明天拨款再开一条流水线。。。

到此建造者模式就讲完了,再总结一下,文章讲究首尾呼应:

建造者模式就是把具体的建造流程制定一个标准(写一个接口),所有的实现类都实现这个接口,导演类负责具体流程,只要是实现了行业标准(实现了这个接口的类),都可以传进来按导演类的流程走,最终导演类返回成品。
用户(厂长)只需要和导演类对接就可以了,提出要求(来个红色跑车),导演类接到任务就去生产产品,但是生产产品的细节用户是无需关心的,最终取到的是成品就OK了。

建造者模式优点:当多个对象的流程大致都相同时,可以使用建造者模式,细节易于控制,又使成品本身和细节解耦,抽象出细节建立一个标准,每增加一种产品就可以直接实现接口,易于扩展。
建造者模式缺点:优点的第一条反过来就是缺点,当想要建造的对个对象流程差异化很大时,就不再适合使用构造者模式,当创建相似的对象不多时,就不至于再专门按照建造者模式架构,也限制了它的扩展。

二、建造者模式和工厂模式
相对来说,工厂模式对细节操控的粒度比较粗,工厂模式更加关注于如何创建对象、获取对象,建造者模式更加偏重于对象的细节,可以更好的对参数进行更改和优化把控。但是两种模式并不能因此就分出优劣,它们各有其适应的应用场景。比如当使用者更偏重于对象的获取,想把创建对象的过程隐藏,就可以用工厂方法模式,当有多个相似对象需要获取,就可以使用抽象工厂模式。 但是当使用者更想对细节进行构造,比如在获取最终的对象之前,我对它具体的实现有不同的细节构造,张三要红色带尾翼两座的跑车,李四要黑色加长五座的商务车,这时候就可以用建造者模式来更精确的把控细节,但是建造者模式的好处就是,即使对细节精细刻画,也不会增加耦合度,实现了具体实现类和对象的解耦。
另外我想了一下,建造者模式的导演类实际上和模板方法模式的作用是一样的,都是把控流程,比如可以先装轮子,也可以先喷车漆,修改流程只需要在导演类调整一下顺序就可以了,具体的模板方法模式可以参考另一篇文章:JAVA23种设计模式——模板方法模式

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值