说明
目标
实现方式
抽象工厂模式 VS 建造者模式
其他链接
1. 将产品和产品建造过程解耦
2. 五大创建型模式之一,其他还有抽象工厂模式、原型模式、单例模式、工厂模式。
3. 建造者模式(Builder Pattern)又叫生成器模式。将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
4. 一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容构建它们,不需要知道内部的具体构建细节。
5. 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法 中,使得创建过程更加清晰,也更方便使用程序来控制创建过程,增加新的具体建造者无须修改原有类库的代码
6. 如果产品之间的差异性很大,则不适合使用建造者模式
1. 不同方法创建对象
2. 无需知道构建对象的细节
这一天,上级领导要求我开发一个简单的管理系统。他负责指挥引导,我负责编程开发。开发完,系统交给他,他负责验收。这便可以用建造者模式进行描述:
/**
* 建造者模式
*
* 举例:领导让我写一个简单的管理系统
*
* @author ZRH
* @version 1.0.0
* @date 2020/7/28
*/
public class BuilderTest {
public static void main(String[] args) {
// 领导指挥我,我负责开发系统
Leader leader = new Leader(new Me(new ManageSystem()));
// 开发完,交给领导,领导得到了管理系统
ManageSystem manageSystem = leader.developManageSystem("炫丽的登录页面"
, "酷炫的欢迎页面", "好看的注册页面");
System.out.println(manageSystem);
}
}
/**
* 领导(Director类), 指挥开发过程
*
* @author ZRH
* @date 2020/7/28
* @version 1.0.0
*/
class Leader {
/**
* 利用多态,便于以后添加别的开发工程师
*/
private Engineer me;
public Leader(Engineer me) {
this.me = me;
}
/**
* 开发交给小弟,领导负责验收
* @param loginPage 登录页面
* @param welcomePage 欢迎页面
* @param registerPage 注册页面
* @return
*/
public ManageSystem developManageSystem(String loginPage, String welcomePage, String registerPage) {
this.me.developLoginPage(loginPage);
this.me.developWelcomePage(welcomePage);
this.me.developRegisterPage(registerPage);
return this.me.developManageSystem();
}
}
/**
* 开发工程师(Builder)
*
* @author ZRH
* @date 2020/7/28
* @version 1.0.0
*/
interface Engineer {
/**
* 开发登录页面
*
* @param loginPage 登录页面
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
void developLoginPage(String loginPage);
/**
* 开发欢迎页面
*
* @param welcomePage 欢迎页面
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
void developWelcomePage(String welcomePage);
/**
* 开发注册页面
*
* @param registerPage 注册页面
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
void developRegisterPage(String registerPage);
/**
* 开发完成管理系统
*
* @return builder.ManageSystem
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
ManageSystem developManageSystem();
}
/**
* 我自己(具体的Builder)
*
* @author ZRH
* @date 2020/7/28
* @version 1.0.0
*/
class Me implements Engineer{
private ManageSystem manageSystem;
public Me(ManageSystem manageSystem) {
this.manageSystem = manageSystem;
}
/**
* 开发登录页面
*
*
* @param loginPage 登录页面
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
@Override
public void developLoginPage(String loginPage) {
manageSystem.setLoginPage(loginPage);
}
/**
* 开发欢迎页面
*
*
* @param welcomePage 欢迎页面
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
@Override
public void developWelcomePage(String welcomePage) {
manageSystem.setWelcomePage(welcomePage);
}
/**
* 开发注册页面
*
*
* @param registerPage 注册页面
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
@Override
public void developRegisterPage(String registerPage) {
manageSystem.setRegisterPage(registerPage);
}
/**
* 开发完成管理系统
*
*
* @return builder.ManageSystem
* @author : ZRH
* @version : 1.0.0
* @date : 2020-07-28
*/
@Override
public ManageSystem developManageSystem() {
return this.manageSystem;
}
}
/**
* 管理系统(产品类Product--被建造的对象)
*
* @author ZRH
* @date 2020/7/28
* @version 1.0.0
*/
class ManageSystem {
/**
* 登录页面
*/
private String loginPage;
/**
* 欢迎页面
*/
private String welcomePage;
/**
* 注册页面
*/
private String registerPage;
public String getLoginPage() {
return loginPage;
}
public void setLoginPage(String loginPage) {
this.loginPage = loginPage;
}
public String getWelcomePage() {
return welcomePage;
}
public void setWelcomePage(String welcomePage) {
this.welcomePage = welcomePage;
}
public String getRegisterPage() {
return registerPage;
}
public void setRegisterPage(String registerPage) {
this.registerPage = registerPage;
}
@Override
public String toString() {
return "ManageSystem{" +
"loginPage='" + loginPage + '\'' +
", welcomePage='" + welcomePage + '\'' +
", registerPage='" + registerPage + '\'' +
'}';
}
}
但是,领导验收的时候觉得这样太简单了,他需要像数据分析那种页面,并且他想要那种,自由开发管理系统,想要什么页面,就能方便地插进去。于是乎,可以用内部类的方式去创建:
/**
* 建造者模式-内部类形式(可替代多参构造方法)
*
* @author ZRH
* @date 2020/7/28
* @version 1.0.0
*/
public class BuilderInnerClassTest {
public static void main(String[] args) {
NewManageSystem newManageSystem = new NewManageSystem.ManageSystemBuilder("绚丽的登录页面"
, "注册页面", "欢迎页").setDataAnalysePage("来一个数据分析页面").build();
System.out.println(newManageSystem);
NewManageSystem anotherManageSystem = new NewManageSystem.ManageSystemBuilder("绚丽的登录页面"
, "注册页面", "欢迎页").setEmailSendPage("来一个邮箱页面").build();
System.out.println(anotherManageSystem);
}
}
/**
* 产品类
*
* @author ZRH
* @date 2020/7/28
* @version 1.0.0
*/
class NewManageSystem {
/**
* 登录页面
*/
private String loginPage;
/**
* 欢迎页面
*/
private String welcomePage;
/**
* 注册页面
*/
private String registerPage;
/**
* 数据分析页面
*/
private String dataAnalysePage;
/**
* 发邮箱页面
*/
private String emailSendPage;
/**
* NewManageSystem产品自己也充当 Director
*
*
* @param builder
* @author ZRH
* @date 2020-07-21
* @version 1.0.0
*/
private NewManageSystem(ManageSystemBuilder builder) {
this.loginPage = builder.loginPage;
this.registerPage = builder.registerPage;
this.welcomePage = builder.welcomePage;
this.dataAnalysePage = builder.dataAnalysePage;
this.emailSendPage = builder.emailSendPage;
}
/**
* 声明一个静态内存类 Builder
*/
public static class ManageSystemBuilder {
// 系统的必须页面
private String loginPage;
private String registerPage;
private String welcomePage;
// 其它一些可选页面
private String dataAnalysePage;
private String emailSendPage;
public ManageSystemBuilder(String loginPage, String registerPage, String welcomePage) {
this.loginPage = loginPage;
this.registerPage = registerPage;
this.welcomePage = welcomePage;
}
// 自由设置,需要就调用
public ManageSystemBuilder setDataAnalysePage(String dataAnalysePage) {
this.dataAnalysePage = dataAnalysePage;
return this;
}
public ManageSystemBuilder setEmailSendPage(String emailSendPage) {
this.emailSendPage = emailSendPage;
return this;
}
// 生成最终的产品
public NewManageSystem build() {
return new NewManageSystem(this);
}
}
@Override
public String toString() {
return "NewManageSystem{" +
"loginPage='" + loginPage + '\'' +
", welcomePage='" + welcomePage + '\'' +
", registerPage='" + registerPage + '\'' +
", dataAnalysePage='" + dataAnalysePage + '\'' +
", emailSendPage='" + emailSendPage + '\'' +
'}';
}
}
抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。
【Java设计模式】简单学工厂模式
【Java设计模式】简单学抽象工厂模式
【Java设计模式】简单学建造者模式
【Java设计模式】简单学单例模式
【Java设计模式】简单学原型模式