android设计模式的建造者模式,请举例
在Android开发中,建造者模式(Builder Pattern)是一种常用的设计模式,它主要用于构建复杂对象。建造者模式通过将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适用于那些需要多个步骤来创建对象的场景,并且这些步骤的顺序可能是固定的,但具体的值可能是变化的。
建造者模式的基本结构
- 产品(Product)角色:它是被构建的复杂对象,包含多个组成部件的类(属性)。
- 抽象建造者(Builder)角色:定义一个接口,用于规范产品对象的各个组成成分的建造。一般为抽象类或接口,包含创建产品各个子部件的抽象方法。
- 具体建造者(ConcreteBuilder)角色:实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造方法内部,通常还包含一个指向产品对象的引用,这个引用是在具体的builder初始化时传入的。
- 指挥者(Director)角色:负责安排已有模块的顺序,然后告诉Builder开始建造。
Android中的建造者模式示例
假设我们需要在Android中创建一个复杂的用户信息对象UserInfo
,这个对象包含姓名、年龄、地址等多个属性,并且这些属性的设置可能依赖于不同的场景。
1. 定义产品(Product)
java复制代码
public class UserInfo { | |
private String name; | |
private int age; | |
private String address; | |
// 私有构造函数,防止外部直接创建 | |
private UserInfo() {} | |
// Getter 和 Setter 省略 | |
@Override | |
public String toString() { | |
return "UserInfo{" + | |
"name='" + name + '\'' + | |
", age=" + age + | |
", address='" + address + '\'' + | |
'}'; | |
} | |
} |
2. 定义抽象建造者(Builder)
java复制代码
public interface UserInfoBuilder { | |
UserInfoBuilder setName(String name); | |
UserInfoBuilder setAge(int age); | |
UserInfoBuilder setAddress(String address); | |
UserInfo build(); | |
} |
3. 定义具体建造者(ConcreteBuilder)
java复制代码
public class UserInfoBuilderImpl implements UserInfoBuilder { | |
private UserInfo userInfo; | |
public UserInfoBuilderImpl() { | |
this.userInfo = new UserInfo(); | |
} | |
@Override | |
public UserInfoBuilder setName(String name) { | |
userInfo.setName(name); | |
return this; // 链式调用 | |
} | |
@Override | |
public UserInfoBuilder setAge(int age) { | |
userInfo.setAge(age); | |
return this; | |
} | |
@Override | |
public UserInfoBuilder setAddress(String address) { | |
userInfo.setAddress(address); | |
return this; | |
} | |
@Override | |
public UserInfo build() { | |
return userInfo; | |
} | |
} |
4. 使用(指挥者角色可以省略,因为直接通过建造者即可构建对象)
java复制代码
public class BuilderPatternDemo { | |
public static void main(String[] args) { | |
UserInfoBuilder userInfoBuilder = new UserInfoBuilderImpl(); | |
UserInfo userInfo = userInfoBuilder | |
.setName("张三") | |
.setAge(30) | |
.setAddress("北京市朝阳区") | |
.build(); | |
System.out.println(userInfo); | |
} | |
} |
在这个例子中,我们没有显式地定义指挥者(Director)角色,因为直接通过建造者(UserInfoBuilderImpl
)就可以完成对象的构建。这种方式在Android开发中非常常见,尤其是在处理那些需要多个步骤来初始化的复杂对象时。