【Java设计模式】简单学建造者模式——自由开发管理系统

目录

说明

目标

实现方式

抽象工厂模式 VS 建造者模式

其他链接


说明

1. 将产品和产品建造过程解耦

2. 五大创建型模式之一,其他还有抽象工厂模式、原型模式、单例模式、工厂模式。

3. 建造者模式(Builder Pattern)又叫生成器模式。将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象

4. 一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容构建它们,不需要知道内部的具体构建细节。 

5. 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法 中,使得创建过程更加清晰,也更方便使用程序来控制创建过程,增加新的具体建造者无须修改原有类库的代码

6. 如果产品之间的差异性很大,则不适合使用建造者模式


目标

1. 不同方法创建对象

2. 无需知道构建对象的细节


实现方式

这一天,上级领导要求我开发一个简单的管理系统。他负责指挥引导,我负责编程开发。开发完,系统交给他,他负责验收。这便可以用建造者模式进行描述:

【Java设计模式】简单学建造者模式——自由开发管理系统_第1张图片

/**
 * 建造者模式
 *
 * 举例:领导让我写一个简单的管理系统
 *
 * @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 + '\'' + '}'; } }


抽象工厂模式 VS 建造者模式

抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品


其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

你可能感兴趣的:(Java设计模式,Java)