Builder模式 【Java设计模式】

Builder模式

android


构建者(Builder)模式(又叫生成器设计模式):

当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如VO、PO、Entity...),要创建的话可能就需要了解这个类的内部结构,还有这些东西是怎么组织装配等一大坨乱七八糟的东西,这个时候就会增加学习成本而且会很混乱,这个时候就想啊想一种什么法子来管理一下这个类中的数据呢,怎么在创建的时候让它按部就班的来,并且代码可读性很好别让我看花了眼啊,我要的东西也能都很好设置进来,这就是Builder模式的应用场景,Builder模式可以将一个类的构建和表示进行分离。

看例子:

class Person {
    private var name: String? = null
    private var age: String? = null
    private var height: String? = null
    private var weight: String? = null
    private var sex: String? = null

    constructor(person: Person){
        this.name=person.name
        this.age=person.age
        this.height=person.height
        this.weight=person.weight
        this.sex=person.sex
    }

    private constructor()

    class Builder {
        private val person: Person = Person()

        fun name(name: String): Builder {
            person.name = name
            return this
        }

        fun age(age: String): Builder {
            person.age = age
            return this
        }

        fun height(height: String): Builder {
            person.height = height
            return this
        }

        fun weight(weight: String): Builder {
            person.weight = weight
            return this
        }

        fun sex(sex: String): Builder {
            person.sex = sex
            return this
        }

        fun build(): Person {
            return Person(person)
        }
    }

    override fun toString(): String {
        return "Person(name=$name, age=$age, height=$height, weight=$weight, sex=$sex)"
    }
}

调用以及运行结果:

class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val build = Person.Builder()
            .age("16")
            .height("199")
            .name("ODP")
            .weight("180")
            .sex("男")
            .build()
        
        Log.e("odp", "p1:$build")
    }
}

 

注意:

       我们的Person类里面的无参数构造器是被private修饰,也就是说让用户调用的时候只能通过我们想要的方式(Builder去点每一个属性)去调用。