一、建造者模式概念
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可 以创建不同的表示。建造者模式是一种对象创建型模式。 建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就 可以构建它们,用户不需要知道内部的具体构建细节
二、建造者模式角色介绍
在建造者模式结构图中包含如下几个角色:
● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接 口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一 类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方 法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品 的内部表示并定义它的装配过程。 ●Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽 象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建 造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。
三、应用场景及案例
假定要开发一个网站,公司有两种开发方案,一队java开发者,一队.net开发者。
他们的故事就在下面:
public class Builder {
public static void main(String[] args) {
// 客户决定采用java开发
JavaDever javaDever = new JavaDever();
XiangMuZhuGuan xiangMuZhuGuan = new XiangMuZhuGuan();
WebSite webSite = xiangMuZhuGuan.dev(javaDever);
System.out.println(webSite.getFront()+"-"+webSite.getEnd());
// 前端采用vue开发完成-后端采用Java开发完成
}
}
class WebSite {
// 前端开发
private String front;
// 后端开发
private String end;
public String getFront() {
return front;
}
public void setFront(String front) {
this.front = front;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
this.end = end;
}
}
/**
* 架构师
*/
abstract class JiaGouShi {
WebSite webSite = new WebSite();
public abstract void buildFront();
public abstract void buildEnd();
public WebSite kaiFaWebSite() {
return webSite;
}
}
/**
* Java开发人员
*/
class JavaDever extends JiaGouShi{
@Override
public void buildFront() {
webSite.setFront("前端采用vue开发完成");
}
@Override
public void buildEnd() {
webSite.setEnd("后端采用Java开发完成");
}
}
/**
* .net开发人员
*/
class NetDever extends JiaGouShi {
@Override
public void buildFront() {
webSite.setFront("前端采用asp开发完成");
}
@Override
public void buildEnd() {
webSite.setEnd("后端采用net开发完成");
}
}
/**
* 项目主管
*/
class XiangMuZhuGuan{
public WebSite dev(JiaGouShi jiaGouShi) {
jiaGouShi.buildFront();
jiaGouShi.buildEnd();
return jiaGouShi.kaiFaWebSite();
}
}