您的位置:首页 > 产品设计 > UI/UE

JAVA设计模式之Builder模式

2017-06-27 11:25 411 查看
1.1 Builder模式介绍

    Builder我在网上看了很多帖子但是并没有详细的讲解 , 基本都是说使得构建过程和表示隔离开 , 其实你如果光看代码的话我是不建议的 , 好了废话不多说下面进入主题

1.2 Builder模式的定义

    将一个复杂对象的构造与它的表示分离(我理解是:说白了就是不在构造方法里面设置参数 , 换一种体现形式 , 让构建过程和部件都可以自由的扩展) , 使同样的构造过程可以创建不同的表示,

1.3 Builder模式的简单实现

我们平常写个Javabean一般可能会这样写

package com.example.liangshaoteng.imageloader;

/**
* Created by liangshaoteng on 17-6-27.
*/

public class Persion {

private String name;
private int age;
private int height;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

@Override
public String toString() {
return "Persion{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}


使用 : 

package com.example.liangshaoteng.imageloader;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.example.liangshaoteng.imageloader.bean.Builder;
import com.example.liangshaoteng.imageloader.bean.Director;
import com.example.liangshaoteng.imageloader.bean.MacBookBuilder;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Persion persion = new Persion();
persion.setName("小明");
persion.setAge(18);
persion.setHeight(178);

Toast.makeText(getApplicationContext(), "persion : " + persion.toString(), Toast.LENGTH_LONG).show();
}
}
但是我们用的时候是不是感觉太麻烦了吗

下面给大家介绍Builder形式

package com.example.liangshaoteng.imageloader;

/**
* Created by liangshaoteng on 17-6-27.
*/

public class Persion {

private String name;
private int age;
private int height;

Persion(builder builder) {
this.name = builder.name;
this.age = builder.age;
this.height = builder.height;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

@Override
public String toString() {
return "Persion{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}

static class builder {

public String name;
public int age;
public int height;

public builder name(String name) {
this.name = name;
return this;
}

public builder age(int age) {
this.age = age;
return this;
}

public builder height(int height) {
this.height = height;
return this;
}

public Persion build() {
return new Persion(this);
}
}
}


使用 : 

package com.example.liangshaoteng.imageloader;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.example.liangshaoteng.imageloader.bean.Builder;
import com.example.liangshaoteng.imageloader.bean.Director;
import com.example.liangshaoteng.imageloader.bean.MacBookBuilder;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Persion.builder builder = new Persion.builder();
Persion persion = builder
.name("小明")
.age(18)
.height(178)
.build();

Toast.makeText(getApplicationContext(), "persion : " + persion.toString(), Toast.LENGTH_LONG).show();
}
}

可见各大框架中大量的运用了Builder模式。最后总结一下

定义一个静态内部类Builder,内部的成员变量和外部类一样
Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

是不是看的简单明了啊 , 一行代码搞定!

其实有很多种表现形式 , 这个只是一个简单的例子,比如 AlertDialog , OkHttp等等都是用了Builder 如果有不对的地方请大家指出谢谢 !

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: