Builder模式也属于链式模式的一部分,我为什么想学这种模式呢?主要是因为最近在看第三方图片缓存的Glide的源码。
Glide.with(this).load(url).into(image);
这就是Glide最简单的用法了,你可以不挺的点点点,然后实现不同的效果,那这种设计模式怎么实现的呢?其实说难不难。
下面就是一个简单的实现:
public class Person {
StringBuffer buffer=new StringBuffer();
public Person addColor(String color) {
buffer.append("穿了一件"+color+"的衣服");
return this;
}
public Person addName(String name) {
buffer.append("姓名"+name);
return this;
}
public Person addAge(int age) {
buffer.append("年龄:"+age);
return this;
}
public void show() {
System.out.println(buffer.toString());
}
}
每个方法只需要返回本类就好了。调用的时候就可以
public static void main(String [] args) {
Person person=new Person();
person.addName("xiaoming").addAge(1).addColor("红色").show();
}
有人说这种根本不能体现会了,那么用以下这个代码可以证明吗?
首先先定义一个对象,可以对这个对象进行操作
public class Person {
private String name;
private int age;
private String address;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
其次定义一个接口,里面所有返回值都需要返回接口本身
public interface IPerson {
IPerson loadName(String mane);
IPerson loadAge(int age);
IPerson laodAddress(String address);
IPerson show();
}
第三有一个build类实现这个接口类:
public class Student implements IPerson{
private Person person=new Person();
@Override
public IPerson loadName(String name) {
// TODO Auto-generated method stub
person.setName(name);
return this;
}
@Override
public IPerson loadAge(int age) {
// TODO Auto-generated method stub
person.setAge(age);
return this;
}
@Override
public IPerson laodAddress(String address) {
// TODO Auto-generated method stub
person.setAddress(address);
return this;
}
public IPerson show() {
System.out.println("姓名:"+person.getName()+"年龄:"+person.getAge()+"地址:"+person.getAddress());
return this;
}
}
最后在使用的时候就可以自由的点点点了:
public static void main(String [] args) {
Student student=new Student();
student.loadName("xiaoming").loadAge(1).show();
}
如果想要复杂点还可以在show的方法里进行判断,如果为null就不调用set方法或者别的内容。