建造者模式是非常常用的一种设计模式,安卓原生的比如StringBuilder、Dialog就是用的这种设计模式。如果满足以下条件的时候可以考虑使用这种设计模式:
1、用来创建一个对象而这个对象是由各种属性组成,创建步骤繁琐。
2、对象的创建过程独立于创建该对象的类。
3、隔离复杂对象的创建和使用,使得相同的创建过程能创建出不同的产品。
该模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
一般该模式有下面4种角色:
product:需要创建的产品
builder:抽象的接口
concretebuilder:具体的接口类,提供一个方法用来创建product对象
director:用来指挥创建,一般用客户端代替
下面就来用一个生产手机的例子来教大家使用这种模式,我们生产一个手机需要有手机的产品名称,屏幕的材质,大小,cup型号,电池容量等。其实我们不想要抽象接口也能设计出这个demo,不过为了提高程序的可扩展性和低耦合,还是希望大家按照正常的流程走,这样你设计的程序才可以更健壮。
我们先来看下效果图:
![](https://box.kancloud.cn/2016-03-18_56eb6b9de2bf7.jpg)
布局文件很简单就不提供了,我们先来看看我们的产品类:
~~~
public class Phone {
String battery, cup, screen, size,brand;
public void setBattery(String battery) {
this.battery = battery;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setCup(String cup) {
this.cup = cup;
}
public void setScreen(String screen) {
this.screen = screen;
}
public void setSize(String size) {
this.size = size;
}
}
~~~
只有一些属性和set方法,很简单,下面来看抽象的builder接口:
~~~
public interface PhoneBuilder {
PhoneBuilder setCup(String cup);
PhoneBuilder setScreen(String material);
PhoneBuilder setSize(String size);
PhoneBuilder setBattery(String battery);
PhoneBuilder setBrand(String brand);
Phone create();
}
~~~
也是很简单,只有一些set方法和一个创建产品的create方法,下面看具体接口类:
~~~
public class ConcreteBuilder implements PhoneBuilder {
private Phone phone = new Phone();
@Override
public ConcreteBuilder setCup(String cup) {
phone.cup = cup;
return this;
}
@Override
public ConcreteBuilder setScreen(String material) {
phone.screen = material;
return this;
}
@Override
public ConcreteBuilder setSize(String size) {
phone.size = size;
return this;
}
@Override
public ConcreteBuilder setBattery(String battery) {
phone.battery = battery;
return this;
}
@Override
public PhoneBuilder setBrand(String brand) {
phone.brand = brand;
return this;
}
public Phone create() {
return phone;
}
}
~~~
实现抽象接口,里面有一个属性是产品类,在create方法里面返回产品类,这些代码都是简单的不需要加注释,最后来看Activity类:
~~~
public class MainActivity extends AppCompatActivity {
StringBuilder sb = new StringBuilder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void saling(View view) {
ConcreteBuilder iphoneBuilder = new ConcreteBuilder();
Phone phone = iphoneBuilder.setSize("5.7英寸").setScreen("AMOLED").setBattery("3000毫安").setCup("骁龙820").setBrand("苹果7").create();
sb.append("品牌:" + phone.brand + "\r\n")
.append("屏幕尺寸:" + phone.size + "\r\n")
.append("屏幕材质:" + phone.screen + "\r\n")
.append("CUP型号:" + phone.cup + "\r\n")
.append("电池容量:" + phone.battery + "\r\n");
//显示结果
((TextView) findViewById(R.id.txtv)).setText(sb.toString());
}
}
~~~
无需多言,类似AlertDialog里面的风格,是不是很爽呢??代码清晰明了。
**总结:**
这种设计模式我们一定要熟练掌握,我们以后提供工具类给别人的时候记得优先考虑的风格就是调用方法后直接返回类本身,这样就可以加快被人写代码的速度,看起来也更加清晰。设计模式都是用来解决一类问题的,而我们掌握的设计模式越多,我们的代码风格也就越清晰优雅,跟着我的脚步我们一起慢慢的学习完26种设计模式吧!期待我以后更新的同时送上今天的demo福利:[demo](http://download.csdn.net/detail/qq379454816/9380706)