热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式那点事读书笔记(3)建造者模式

建造者模式:建造者模式是将复杂的对象构造进行分离,使得每个部件完成比较独立的工作.通过抽象类,接口来约束建造的过程.解决什么问题:当生成的产品对象内部具有复杂的结构.当复杂对象需要

建造者模式: 建造者模式是将复杂的对象构造进行分离,使得每个部件完成比较独立的工作.通过抽象类,接口来约束建造的过程.

解决什么问题: 

  当生成的产品对象内部具有复杂的结构.

  当复杂对象需要与表示分离,可能需要创建不同的表示时.

  当需要向客户隐藏产品内部结构表现时.

UML:

  技术分享

代码结构:

  技术分享

商品的实体:

package com.demo.builder.model;

/**
 * 产品实体
 */
public class MobilePackage {
    private float money;
    private int shortInfo;
    private String music;

    public float getMoney() {
        return money;
    }

    public void setMoney(float money) {
        this.mOney= money;
    }

    public int getShortInfo() {
        return shortInfo;
    }

    public void setShortInfo(int shortInfo) {
        this.shortInfo = shortInfo;
    }

    public String getMusic() {
        return music;
    }

    public void setMusic(String music) {
        this.music = music;
    }
}

建造者的抽象类:

package com.demo.builder.base;

import com.demo.builder.model.MobilePackage;

/**
 * 建造者抽象类
 */
public abstract class AbstractBasePackage {
    protected MobilePackage mobilePackage;

    public AbstractBasePackage() {
        this.mobilePackage = new MobilePackage();
    }
}

抽象建造者的行为:

package com.demo.builder.itf;

import com.demo.builder.model.MobilePackage;

/**
 * 抽象建造者行为
 */
public interface IMobileBuilder {
    void buildMoney();
    void buildShortInfo();
    void buildMusic();
    MobilePackage getMobilePackage();
}

建造者实体1:

package com.demo.builder.itf;

import com.demo.builder.base.AbstractBasePackage;
import com.demo.builder.model.MobilePackage;

/**
 * 建造者实体1
 */
public class MobileBuilderImpl1 extends AbstractBasePackage implements IMobileBuilder{
    @Override
    public void buildMoney() {
        this.mobilePackage.setMoney(20.0f);
    }

    @Override
    public void buildShortInfo() {
        this.mobilePackage.setShortInfo(400);
    }

    @Override
    public void buildMusic() {
        this.mobilePackage.setMusic("歌曲1");
    }

    @Override
    public MobilePackage getMobilePackage() {
        return this.mobilePackage;
    }
}

建造者的实体2:

package com.demo.builder.itf;

import com.demo.builder.base.AbstractBasePackage;
import com.demo.builder.model.MobilePackage;

/**
 * 建造者类2
 */
public class MobileBuilderImpl2 extends AbstractBasePackage implements IMobileBuilder{
    @Override
    public void buildMoney() {
        this.mobilePackage.setMoney(30.0f);
    }

    @Override
    public void buildShortInfo() {
        this.mobilePackage.setShortInfo(600);
    }

    @Override
    public void buildMusic() {
        this.mobilePackage.setMusic("歌曲2");
    }

    @Override
    public MobilePackage getMobilePackage() {
        return this.mobilePackage;
    }
}

指导者:

package com.demo.builder.director;

import com.demo.builder.itf.IMobileBuilder;
import com.demo.builder.model.MobilePackage;

/**
 * 建造指导者
 */
public class MobileDirector {
    public MobilePackage createMobilePackage(IMobileBuilder mobileBuilder) {
        if (mobileBuilder != null) {
            mobileBuilder.buildMoney();
            mobileBuilder.buildMusic();
            mobileBuilder.buildShortInfo();
            return mobileBuilder.getMobilePackage();
        }
        return null;
    }
}

实现方法:

package main;

import com.demo.builder.director.MobileDirector;
import com.demo.builder.itf.MobileBuilderImpl1;
import com.demo.builder.itf.MobileBuilderImpl2;
import com.demo.builder.model.MobilePackage;

/**
 * Created by Administrator on 2016/8/8.
 */
public class MainApp {
    public static void main(String[] args) {
        MobileDirector mobileDirector = new MobileDirector();

        MobileBuilderImpl1 mobileBuilderImpl1 = new MobileBuilderImpl1();
        MobileBuilderImpl2 mobileBuilderImpl2 = new MobileBuilderImpl2();

        printMessage(mobileDirector.createMobilePackage(mobileBuilderImpl1));
        printMessage(mobileDirector.createMobilePackage(mobileBuilderImpl2));
    }

    public static void printMessage(MobilePackage mobilePackage) {
        System.out.println("--话费: " + mobilePackage.getMoney() + "\t短信: " + mobilePackage.getShortInfo() + "\t彩铃: " + mobilePackage.getMusic());
    }
}

设计模式那点事读书笔记(3)----建造者模式


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
author-avatar
百脑汇_惠州店_909
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有