一、介绍
1、流程简介
创建者模式是一种创建型模式。它用于创建出一个由多个简单对象组合而成的复杂的对象。
打个比方:
大家玩游戏最不可或缺的就是人物的形象。比如:LOL,然而作为一个合格的程序员,最基本的素养就是从代码层次考虑它。
1、现在把游戏任务当成那个最复杂的对象,而头、身体和脚则是组成这个复杂对象的简单对象。
2、由于每个人物的头、身子、脚等等等等都不 相同。所以这三个简单对象的不同的类型经过各种不同的组合会组成不同的人物形象。而这个复杂对象基本都是由这三部分组成。(有头有身体有脚)。
3、将生产头、身体、脚分到不同 的部门(类)中去生产
4、这三部分生产成功后,现在由组装部门将其组装到一块。而组装肯定得有个顺序啊。
6、我们在添加一个整体顺序部门,来控制组装的流程。
5、当游戏环节设计部门说,我们需要一个人物,现在由整体顺序部门告诉组装部门我要一个人物,我不管什么人物,只要有头,有身子,有脚就行。整体顺序部门说好嘞。然后交给其下属的专门生产这三部分的部门来生产。生产好了就将这个人物返回。就好了。
2、应用场景:
当你所需要的大对象的各个小对象,小对象相当于大对象的零件。当大对象是由几个小零件组成的,但每个功能不同的小零件的型号很多,而且你不确定要用哪个。此时就可以使用建造者模式。
建造者模式的好处在于:1、建造者独立,易于扩展。2、便于控制细节风险。
二、UML
三、具体实现
我们就用上面的举例来写代码。
1 、Character类带保镖我们要创建的游戏人物。
public class Character {
private List<PartOfRole> parts = new ArrayList<PartOfRole>();
// 添加元素
public void Add(PartOfRole part){
parts.add(part);
}
// 显示游戏角色的详情
public void showCharacterParts() {
Iterator<PartOfRole> list_it = parts.iterator();
System.out.print("角色的形象:");
while (list_it.hasNext()) {
System.out.print(list_it.next().getName()+" ");
}
}
}
2、创建一个游戏部位的接口:
public interface PartOfRole {
public String getName();
public void setName(String describe);
}
3、人物的头、身子、脚分别是三个不同的类
头:
public class Head implements PartOfRole {
private String name;
public void setName(String describe){
this.name=describe;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
身子 :
public class Body implements PartOfRole {
private String name;
public void setName(String describe){
this.name=describe;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
脚:
public class Foot implements PartOfRole {
private String name;
public void setName(String describe){
this.name=describe;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
4、Builder抽象类:
public abstract class Builder {
// 添加头部
public abstract void setHead();
// 添加身体
public abstract void setBody();
// 添加脚
public abstract void setFoot();
// 返回产品
public abstract Character getCharacter();
}
5、Builder接口的实现
public class ConcreteBuilder extends Builder {
private Character character = new Character();
private Properties role_pro = new Properties();
public ConcreteBuilder() {
// TODO Auto-generated constructor stub
try {
role_pro.load(new FileInputStream("src/part.properties"));
} catch (Exception e) {
// TODO: handle exception
System.out.println("属性文件不存在" + e);
}
}
@Override
public void setHead() {
// TODO Auto-generated method stub
PartOfRole head = new Head();
head.setName(role_pro.getProperty("role_head"));
character.Add(head);
}
@Override
public void setBody() {
// TODO Auto-generated method stub
PartOfRole body = new Body();
body.setName(role_pro.getProperty("role_body"));
character.Add(body);
}
@Override
public void setFoot() {
// TODO Auto-generated method stub
PartOfRole foot = new Foot();
foot.setName(role_pro.getProperty("role_foot"));
character.Add(foot);
}
// 返回所产生的对象
@Override
public Character getCharacter() {
// TODO Auto-generated method stub
return character;
}
}
6、导演类
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
// 控制生产产品流程
public void construct(){
builder.setHead();
builder.setBody();
builder.setFoot();
}
}
7、测试类
public class BuilderTest {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Character character = builder.getCharacter();
character.showCharacterParts();
}
}
输出:
角色的形象:"虎头" "牛身" "蛇尾"