• 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对象,消耗内存

  • 相关阅读:
    Fabric.js 自由绘制圆形
    DeepStream系列之kafka IoT功能实现
    C++:类和对象(二)
    好用的Java开发IDEA插件汇总推荐
    Python中property属性、with语句及上下文管理器使用方法代码
    西瓜播放器xgplayer设置自动播放踩坑
    Css的flex布局(弹性盒子)详解
    nodejs+vue+elementui通用在线新闻发布网
    【批处理DOS-CMD命令-汇总和小结】-文件与目录操作命令(md、rd、xcopy、dir、cd、set、move、copy、del、type、sort)
    掌握 R 软件在 Windows 及 Mac 上的下载安装流程
  • 原文地址:https://blog.csdn.net/y2653904/article/details/134373461