天天看点

JAVA设计模式——建造者模式学习心得

Builder模式:为了构造复杂的对象,提升代码的可读性以及可维护性而创造的一种设计模式,在安卓开发中使用很多。

      在构造一个对象时一般有两种方法:

           ①定义私有的成员变量,提供set/get方法;

           ②定义多参数的有参构造器,通过有参构造实例化不同参数需求的对象。

有参构造的缺点很明显,在属性较多时需要提供大量有参构造,且可读性很差;

传统构造pojo对象提供set/get方法的途径应用较多,可读性也很好,但是在开发中我们也许会在为所有想要的属性set值前就使用了这个对象(这个...还是看人吧,大老粗也许会犯),对于存在不可变参数(final)的类无可奈何。'

上面两种构造方法在复杂对象面前都稍显不足,我们引入Builder模式来解决这个问题:

Builder模式是增加了代码量来换取代码的可读性和维护性,基本思想是在待构建对象类中创建一个静态内部类提供set方法,我们在赋值时就可以通过串联调用就简单明了多了~

建造者模式步骤:

        1.创建一个类,提供私有成员变量,提供get方法(可选);

        2.创建一个名为Builder的静态内部类,提供和外部类对应的私有成员变量;

        3.静态内部类中提供类似get方法,不同的是方法返回Builder对象:

JAVA设计模式——建造者模式学习心得

        4.静态内部类中提供返回值类型为外部类类型的build方法,创建一个外部类对象传参Builder对象:

JAVA设计模式——建造者模式学习心得

        5.外部类中提供参数为Builder的私有有参构造,将Builder对象中的值传到外部类中。

demo:

package builder;
/**
   *    建造者模式:
 * 通过静态内部类中提供的set方法和外部类中提供的带有内部类参数的构造 提供常见对象的可读性
 * 缺点是书写复杂
 * 创建对象通过链式调用简单易见 
 * @author malaganguo
 *
 */
public class User {
	private int id ;
	private String firstName;     
    private String lastName;      
    private int age;              
    private String phone;         
    private String address;       
    
    //外部类提供所有的get方法
    public int getId() {
		return id;
	}


	public String getFirstName() {
		return firstName;
	}


	public String getLastName() {
		return lastName;
	}


	public int getAge() {
		return age;
	}


	public String getPhone() {
		return phone;
	}


	public String getAddress() {
		return address;
	}

	public static class Builder {
		//Builder类中同样提供对应成员变量
		private int id ;
		private String firstName;     
	    private String lastName;      
	    private int age;              
	    private String phone;         
	    private String address;  
	    
		public Builder id(int i) {
			id = i;
			return this;
		}


		public Builder firstName(String f) {
			firstName = f;
			return this;
		}


		public Builder lastName(String l) {
			lastName = l;
			return this;
		}


		public Builder age(int a) {
			age = a;
			return this;
		}


		public Builder phone(String p) {
			phone = p;
			return this;
		}


		public Builder address(String a) {
			address = a;
			return this;
		}
		
		public User build() {
			return new User(this);
		}
    }
	
	private User(Builder builder) {
		id = builder.id;
		firstName = builder.firstName;     
	    lastName = builder.lastName;      
	    age = builder.age;              
	    phone = builder.phone;         
	    address = builder.address;  
	}


	@Override
	public String toString() {
		return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", phone="
				+ phone + ", address=" + address + "]";
	}
	
}



           

测试类:

package builder;

public class Test {

	public static void main(String[] args) {
		User zyf = new User.Builder().id(1).firstName("zhang").lastName("yifei").phone("18888888888").address("xupt").build();
		System.out.println(zyf.getId()+"-"+zyf.getFirstName()+"-"+zyf.getLastName());
		System.out.println(zyf.toString());
	}
}
           

测试结果:

JAVA设计模式——建造者模式学习心得

可以看到:建造者模式可以链式赋值简单明了。 build模式可以通过build对象返回需要创建的对象。

Build模式在安卓源码中应用很多,弹窗事件就是一个build模式的例子:

AlertDialog.Builder builder=new AlertDialog.Builder(this);
AlertDialog dialog=builder.setTitle("标题")
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setView(R.layout.myview)
        .setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
 
            }
        })
        .setNegativeButton(R.string.negative, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
 
            }
        })
        .create();
dialog.show();