试想可能有这样一种情况,公司要造一个机器人,老大决定把这个艰巨的任务交给你。
你就去做了,一步一步来:
先造头,
再造一个身子,
再造一个左手,
再造一个右手,
再造一个左脚,
再造一个右脚。
一段时间后你完成了任务,老大看你玩的十分的出色,就又让你去造一只猫,紧接着
你又去做了,一步一步来:
先造头,
再造一个身子,
再造一个左手,
再造一个右手,
再造一个左脚,
再造一个右脚。
你又完成了,突然之间发现你漏了一条尾巴!!
现实中,这种状况非常容易出现,要去生成一个内部比较复杂的类,很容易出现“漏”创建某一个部分的情况。
这时,建造者模式就能够很好的帮助我们解决这个问题。
当需要将一个复杂对象的勾践与它的表示分离,使得同样的勾践过程可以创建一个不同的表示的意图时,就可以使用建造者模式。
当使用了建造者模式后,用户就只需要指定需要搭建的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
首先还是看下面的类图:
首先有一个Product产品类,这个可以随意,
接下来就是一个抽象的建造者Builder类,这个类主要是定义规范,创建各个部分的规范类
而两个concrete开头的就是创建类的具体类。
Director则是根据用户需求构建对象的指挥者类:
下面看代码:
Builder类:
package com.blog.anla.Builder;
/**
* 抽象的建造者类,确定产品由两个部件组成
* 以及得到产品的方法getResult
* @author U-ANLA
*
*/
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
Product类:
package com.blog.anla.Builder;
import java.util.ArrayList;
import java.util.List;
/**
* 具体产品
* @author U-ANLA
*
*/
public class Product {
List<String> parts = new ArrayList<String>();
public void add(String part){
parts.add(part);
}
public void show(){
System.out.println("产品 已创建");
for(int i = 0;i < parts.size();i++){
System.out.println(parts.get(i));
}
}
}
ConcreteBuilder1类:
package com.blog.anla.Builder;
/**
* 具体建造者类
* @author U-ANLA
*
*/
public class ConcreteBuilder1 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
ConcreteBuilder2类:
package com.blog.anla.Builder;
/**
* 具体建造者类
* @author U-ANLA
*
*/
public class ConcreteBuilder2 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
Director类:
package com.blog.anla.Builder;
/**
* 指挥者类,用来指挥建造过程
* @author U-ANLA
*
*/
public class Director {
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
赠人玫瑰手留余香(oo)