码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Android设计模式--Builder建造者模式


    一,定义

    Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。

    也就是将一个对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    二,使用场景

    1,相同的方法,不同的执行顺序,产生不同的事件结果时

    2,多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时

    3,产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用Builder模式非常合适

    4,当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时

    三,使用Builder模式

    假如我们有一个视频播放器,这个播放器初始化的时候可以设置默认图,视频标题,视频链接。

    那我们使用Builder模式如下:

    新建一个接口,定义视频播放器的功能:

    1. public interface IVideoView {
    2. /**
    3. * 设置视频标题
    4. * */
    5. void setTitle(String title);
    6. /**
    7. * 设置视频封面
    8. * */
    9. void setImage(String img);
    10. /**
    11. * 设置视频链接
    12. * */
    13. void setUrl(String url);
    14. }

    新建一个播放器实现接口,内部定义一个Builder静态内部类,用来构建播放器:

    1. /**
    2. * 视频播放器
    3. * */
    4. public class VideoView implements IVideoView{
    5. private static final String TAG = "VideoView";
    6. private String title;
    7. private String img;
    8. private String url;
    9. public VideoView(Builder builder) {
    10. this.title = builder.title;
    11. this.img = builder.img;
    12. this.url = builder.url;
    13. }
    14. @Override
    15. public void setTitle(String title) {
    16. Log.d(TAG,"title:"+title);
    17. }
    18. @Override
    19. public void setImage(String img) {
    20. Log.d(TAG,"img:"+img);
    21. }
    22. @Override
    23. public void setUrl(String url) {
    24. Log.d(TAG,"url:"+url);
    25. }
    26. public static class Builder{
    27. private String title;
    28. private String img;
    29. private String url;
    30. public Builder setTitle(String title) {
    31. this.title =title;
    32. return this;
    33. }
    34. public Builder setImage(String img) {
    35. this.img =img;
    36. return this;
    37. }
    38. public Builder setUrl(String url) {
    39. this.url =url;
    40. return this;
    41. }
    42. public VideoView bulid(){
    43. return new VideoView(this);
    44. }
    45. }
    46. }

    那么在使用的时候,就可以实现链式调用了:

    1. VideoView videoView = new VideoView.Builder()
    2. .setImage("http://dxxx/ddsd.jpg")
    3. .setTitle("视频")
    4. .setUrl("http://sdsdsds.mp4")
    5. .bulid();

    这样就可以优雅的使用链式调用去创建我们的对象了。

    四,安卓中的使用案例

    AlertDialog:

    1. AlertDialog.Builder builder = new AlertDialog.Builder(this);
    2. builder
    3. .setIcon(R.drawable.ic_launcher_background)
    4. .setMessage("title")
    5. .create()
    6. .show();

    五,总结

    优点:

    1,封装性好,使用Builder模式可以使客户端不必知道产品内部组成的细节

    2,建造者独立,容易扩展

    缺点:

    会产生多余的Builder对象,消耗内存

  • 相关阅读:
    阿里云国际ECS云服务器免费试用版如何使用?
    降本增效利器?Share Creators智能数字资产管理系统真香!
    OB38R08T1读24C64程序
    解决微信环境下无法通过链接唤起App Store、微信访问App Store 链接白屏问题
    计算机视觉——两视图几何求解投影矩阵
    2022河南萌新联赛第(四)场-苹方树-(LCA+重链剖分)
    891. 子序列宽度之和(每日一难phase3-4)
    【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【08】【商品服务】Object划分_批量删除
    这么高颜值的Kubernetes管理工具Lens,难道还不能C位出道吗
    成为会带团队的技术人 稳定性(三):那些年源源不断的“红包”事故
  • 原文地址:https://blog.csdn.net/y2653904/article/details/134373461
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号