JAVA设计模式之Builder模式

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 如果有不对的地方请大家指出谢谢 !

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值