1.建造者模式?
一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,他们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。
建造者模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的产品对象。
建造者模式将产品的结构和产品的零件建造过程堆客户隐藏起来,把堆建造过程进行指挥的责任和具体建造者零件的责任分开,达到责任划分和封装的目的。
`此模式涉及到的角色:
- 抽象建造者角色: 给出一个抽象接口,以规范产品对象的各个组成成分的建造。模式中直接创建产品对象的是具体的建造者角色。具体建造者类必须实现这个接口所要求的方法:一种是建造方法,另一种是结果返回方法。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少零件,就有多少对应的建造方法。
- 具体建造者角色:担任这个的是与应用程序紧密相关的一些类,他们在应用程序调用下创建产品的实例。他的任务包括:
1、实现抽象建造者Builder所申明的接口,给出一步一步地完成产品实例的操作。
2、在建造完成后,提供产品的实例。 - 导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演这角色并没有产品类的具体信息,真正拥有产品类的具体信息的是具体创建者角色。
- 产品角色:产品便是建造中的复杂对象。一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
接下来看一个简单的Demo,方便掌握此模式。
先贴出uml:
代码:
/**
* Builder --- 抽象建造者,确定产品由partA和partB两个部分组成,并申明一个得到产品建造后结果的方法GetResult
* */
public interface Builder {
void BuildPartA();
void BuildPartB();
Product getResult();
}
/**
* 具体的建造类
* */
public class ConcreateBuilder implements Builder{
Product p = new Product();
public void BuildPartA() {
p.add("部件A");
}
public void BuildPartB() {
p.add("部件B");
}
public Product getResult() {
return p;
}
}
/**
* 具体的建造类1
* */
public class ConcreateBuilder1 implements Builder{
Product p = new Product();
public void BuildPartA() {
p.add("部件X");
}
public void BuildPartB() {
p.add("部件Y");
}
public Product getResult() {
return p;
}
}
/**
* 指挥者类
* */
public class Director {
public void contructer(Builder builder){
builder.BuildPartA();
builder.BuildPartB();
}
}
public class Product {
List<String> list = new ArrayList<String>();
//添加产品部件
public void add(String part){
list.add(part);
}
//列举产品部件
public void show(){
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String x = itr.next();
System.out.println(x);
}
}
}
测试类:
public class Demo {
public static void main(String[] args) {
Director d = new Director();
Builder b1 = new ConcreateBuilder();
Builder b2 = new ConcreateBuilder1();
d.contructer(b2);
Product p = b2.getResult();
p.show();
}
}
使用场景?
在以下情况下应当使用建造者模式:
1、需要生产的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成部分。
2、需要生产的产品对象的属性相互依赖。建造者模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另外一个属性赋值后才可以在被赋值,此时就可以利用建造者模式的设计思想来完成。
3、在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。