1.建造者模式定义
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式的通用类图如下:
建造者模式通常包括下几个角色:
1. builder(抽象建造者):给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder(具体建造者):实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例。
3. Director(指导者):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product(产品类):要创建的复杂对象。
Product是最终的产品类,Builder是建造者,Director是指挥者。Director负责安排已有模块的顺序,然后告诉Builder开始建造。
例如,创建一个人的建造者模式,代码如下。首先创建一个Human:
//get和set方法省略
public class Human {
private String head;
private String body;
private String hands;
private String foots;
}
首先,我们要创建人的头,身体,双手,双脚。我们定义一个接口创建人体部分的方法:
//用来创建人的身体部分
public interface BuildMan {
public void buildHead();
public void buildBody();
public void bulidHands();
public void buildFoots();
public Human creatHuman();
}
我们要创建具体的人,要实现这个接口。最后的一个方法,我们创建出具体的人。现在实体和接口定义好了,
我们来创建一个男人和女人:
//实现接口创建具体的男人
public class ConcreteBuildMan implements BuildMan{
private Human man;
public ConcreteBuildMan(){
man = new Human();
}
@Override
public void buildHead() {
man.setHead("我是男人头");
}
@Override
public void buildBody() {
man.setBody("我是男人身体");
}
@Override
public void bulidHands() {
man.setHands("我是男人双手");
}
@Override
public void buildFoots() {
man.setFoots("我是男人双脚");
}
@Override
public Human creatHuman() {
return man;
}
}
//实现接口创建具体的女人
public class ConcreteBuildWoman implements BuildMan{
private Human womanman;
public ConcreteBuildWoman(){
womanman = new Human();
}
@Override
public void buildHead() {
womanman.setHead("我是女人头");
}
@Override
public void buildBody() {
womanman.setBody("我是女人身体");
}
@Override
public void bulidHands() {
womanman.setHands("我是女人双手");
}
@Override
public void buildFoots() {
womanman.setFoots("我是女人双脚");
}
@Override
public Human creatHuman() {
return womanman;
}
}
男人和女人实现接口,创建出具体的人。对于建造者模式,其最终要的就是director,这个主导者主要是执行创建人的每一步动作的。代码如下
public class Director {
public Human getConerectMan(BuildMan man){
man.buildHead();
man.buildBody();
man.bulidHands();
man.buildFoots();
Human human = man.creatHuman();
return human;
}
}
通过Director,我们可以创建不同的人。男人和女人主要是为了展示可以创建不同的人,例子不好。有局限性,但是主要是表达其意思。我们也可以有例如商品,动物这些。测试代码如下:
public class BuilderTest {
public static void main(String[] args) {
Director director = new Director();
Human man = director.getConerectMan(new ConcreteBuildMan());
Human woman = director.getConerectMan(new ConcreteBuildWoman());
System.out.println(man.getHead());
System.out.println(woman.getHead());
}
}
建造者模式,主要是将一个复杂对象的构建与它的表示分离。将步骤分离,主要集中到Director,用Director去执行整个过程。真正的打到分离模块的功能。
2、建造者模式与工厂模式的区别:
工厂模式
工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个 产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
建造者模式
建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
3、建造者模式的优点和缺点
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。