本文主要讲一下建造者模式,因为其和工厂模式都是封装细节,只提供最终的成品,所以讲完建造者模式,再讲一下两种模式之间的异同,以及在什么环境下使用什么样的模式。
如果对工厂模式还不了解可以先看这篇文章: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();@Overridepublic void buildBody() {car.setBody("车身构建成型,流畅的车身弧线");}@Overridepublic void buildColor() {car.setColor("炫丽的红色车漆喷漆完成");}@Overridepublic void buildWheel() {car.setWheel("跑车专用轮胎装配完成");}@Overridepublic void buildEngine() {car.setEngine("跑车的灵魂,引擎装备成功");}@Overridepublic 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种设计模式——模板方法模式