【Kotlin设计模式】建造者模式在Android中的应用

前言

建造者模式(Builder Pattern)是一种创建型设计模式,一步一步地构建一个复杂对象的不同部分,而不是直接创建该对象的实例。建造者模式的核心思想是将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

具体来说,构建者模式使用一个独立的构建器(Builder)类来封装对象的构建过程。构建器类提供一系列方法来设置对象的属性,并最终返回构建好的对象。这种方式可以避免使用多个构造函数或过多的参数,使得对象的构建过程更加直观和易于扩展。

应用

Android中,也有很多组件和库中使用到了建造者模式,比如原生AlertDialogRetrofitNotificationCompat等。

AlertDailog中应用:

kotlin 复制代码
val builder = AlertDialog.Builder(this)
builder.setTitle("设计模式")
       .setMessage("这是建造者模式吗")
       .setPositiveButton("是的") { dialog, _ -> dialog.dismiss() }
       .setNegativeButton("不是") { dialog, _ -> dialog.dismiss() }
       .create()
       .show()
       

Retrofit中应用:

kotlin 复制代码
val retrofit = Retrofit.Builder()
    .baseUrl("https://blog.csdn.net/ho")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val apiService = retrofit.create(ApiService::class.java)

从上述例子可以看出,建造者模式的写法比较清晰,比如AlertDailog中的builder对象采用链式调用setTitlesetMessage等方法,我们就仿照AlertDailog使用Kotlin来实现下建造者模式。

kotlin 复制代码
package com.ho.csdn.widget

import android.app.Dialog
import android.content.Context
import android.graphics.Bitmap
import java.lang.IllegalArgumentException


class StudentPickDialog(context: Context) : Dialog(context) {

    private var mId: Long = 0L

    private var mAvatar: Bitmap? = null

    private var mName: String = ""

    private var mAge: Int = 0

    private constructor(
        context: Context,
        id: Long,
        avatar: Bitmap?,
        name: String,
        age: Int
    ) : this(context) {
        mAvatar = avatar
        mId = id
        mName = name
        mAge = age
    }

    companion object {

        fun init(context: Context): Builder {
            return Builder(context)
        }
    }


    data class Builder(private val mContext: Context) {

        private var mId: Long = 0L

        private var mAvatar: Bitmap? = null

        private var mName: String = ""

        private var mAge: Int = 0

        /**
         * 设置id
         */
        fun setId(id: Long) = apply {
            this.mId = id
        }

        /**
         * 设置头像
         */
        fun setAvatar(avatar: Bitmap) = apply {
            this.mAvatar = avatar
        }

        /**
         * 设置名称
         */
        fun setName(name: String) = apply {
            this.mName = name
        }

        /**
         * 设置年龄
         */
        fun setAge(age: Int) = apply {
            this.mAge = age
            if (mAge > 150) {
                throw IllegalArgumentException("年龄超过了限制")
            }
        }

        fun build() = StudentPickDialog(mContext, mId, mAvatar, mName, mAge)
    }
}

这里自定义Dailog显示选择某一学生信息做展示,建造者模式部分如下,新建StudentPickDialog继承Dialog,在类内部新建Builder类,创建setAvatarsetNamesetAge且返回Builder对象,外部创建了Builder对象后就可以链式调用方法了。

这里使用到了Kotlin的apply扩展函数,函数返回调用它的对象本身的特性。

新建build()方法,返回StudentPickDialog对象,将Id、名字、头像、年龄作为构造参数传入,调用如下。

kotlin 复制代码
   StudentPickDialog
          .init(requireContext())
          .setId(92229)
          .setAvatar(detectBitmap!!)
          .setName("Ho")
          .setAge(30)
          .build()
          .show()
          

总结

Android 中,建造者模式被广泛应用于需要配置多个选项、步骤复杂或构建过程不容易一步完成的场景。通过建造者模式,可以更轻松地创建和配置复杂对象。

相关推荐
烬羽1 小时前
NestJS 依赖注入:Controller 里那个没有 new 的 service,到底从哪来的?
设计模式·typescript·nestjs
爱笑鱼1 小时前
Android 系统启动机制(二):init.rc 不是普通脚本,service、action 和 property 怎样驱动启动?
android
新鲜势力呀2 小时前
深入理解 Elliot CUDA 编程核心:PHP 实现 CUDA 并行计算思想与实践
android·开发语言·php
恋猫de小郭2 小时前
Flutter 3.47 首坑,analysis_options 问题连环回归
android·前端·flutter
ue星空4 小时前
第一个安卓程序
android
淡淡的香烟4 小时前
Androidiot蓝牙配网简单封装
android·物联网
gxgldyh4 小时前
Android Framework源码解析(九):App进程诞生全流程——从AMS请求到Zygote fork源码深度拆解
android·framework·zygote·android 启动流程·android app创建流程
牛哇网络工作室11 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
一笑的小酒馆12 小时前
Androidiot蓝牙配网简单封装
android
用户9385156350713 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs