Android架構進階(六)—— 建造者模式

建造者模式

定義

將一個複雜對象的構建與它的標示分離,使得同樣的構建過程可以創建不同的標示。

簡介

  • 建造者模式使用的目的是構造複雜對象,如果對象內部不是很複雜或者功能不是很多,是沒有必要使用建造者模式的
  • 使用者可以不用關心建造的過程和細節,只要使用對外提供的公共方法來構造對象即可。
  • 關於建造者模式的使用,基本有兩類方式,一種是傳統的外部Builder類的方式,一般是使用靜態內部類Builder的方式去構造對象。

傳統Builder模式

1. 成員

  • 1.產品類;
  • 2.抽象的Builder類;
  • 3.Builder實現類;
  • 4.使用者;

2. 實例

我們使用建造者模式的目的,是創建複雜對象,那麼首先,我們就需要這個複雜的對象,即產品類

public class Product{
	private int param1;
	private int param2;
	private int param3;
	private int param4;
	private int param5;
	private int param6;
	/**
	/* getter and setter
	**/
	...
	 @Override
    public String toString() {
		return ""+param1+param2+param3+param4+param5+param6;
	}
}

接下來是此模式的核心——抽象Builder類(接口)

public interface Builder{
	void setParam1();
	void setParam2();
	void setParam3();
	void setParam4();
	void setParam5();
	void setParam6();
	Product getProduct();
}

接下來就需要我們的實現類

public class BuilderImpl implements Builder{
	private Product product;
	public BuilderImpl(){
		this.product = new Product();
	}

	@Override
	public void setParam1(){
		product.setParam1(1);
	}

	@Override
	public void setParam2(){
		product.setParam2(2);
	}
	
	@Override
	public void setParam3(){
		product.setParam3(3);
	}
	
	@Override
	public void setParam4(){
		product.setParam4(4);
	}
	
	@Override
	public void setParam5(){
		product.setParam5(5);
	}

	@Override
	public void setParam6(){
		product.setParam6(6);
	}
	
	@Override
    public Product getProduct() {
        return product;
    }
}

最後我們實現一下使用類

public class Use{
	private Builder builder;
	public void setBuilder(Builder builder){
		this.builder = builder;
	}

	public void createComputer(){
		builder.setParam1();
		builder.setParam2();
		builder.setParam3();
		builder.setParam4();
		builder.setParam5();
		builder.setParam6();
	}
	
	public Product getProduct(){
		return builder.getProduct();
	}
}

3.使用

public class Test{
	public static void main(String[] args){
		Use use = new Use();
		use.setBuilder(new BuilderImpl ());
		use.createProduct();
		log.i("Product",use.toString());
	}
}

輸出:

Product:"21"

改革Builder模式 —— 靜態內部類Builder

1.成員

只有產品類和內部Builder類

public class Product{
	public static class Builder{
	}
}

2.實例

public class Product{

	private final String param1;
	private final String param2;
	private final String param3;
	
	private Product(Builder builder){
		this.param1 = builder.param1;
		this.param2 = builder.param2;
		this.param3 = builder.param3;
	}
	
	public static class Builder{
		private final String param1;
		private String param2;
		private String param3; 
		
		public Builder(String param1){
			this.param1 = param1;
		}
		
		public Builder param2(){
			this.param2 = param2;
			return this;
		}

		public Builder param3(){
			this.param3 = param3;
			return this;
		}

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

3.使用

public class Use{
	public static void main(String[] args){
		Product p = new Product.Builder("param1")
			.param2("param2")
			.param3("param3")
			.build();
	}
}

總結

  • 我們其實使用過很多建造者模式,例如,AlertDialog的Builder。
  • 建造者模式是用來創建複雜對象的,如果只是普通的對象,內部邏輯較少或者內部屬性不多就沒有必要使用建造者模式(以上兩個例子就沒必要用Builder模式,本人只是用作樣例)

優缺點

優點 封裝性良好,易於解耦,易於擴展,易於精確控制對象的創建
缺點 產生多餘的Build對象,如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章