一、什么是建造者模式
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。
建造者模式的角色定义,在建造者模式中存在以下4个角色:
1、builder:为创建一个产品对象的各个部件指定抽象接口。
2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3、director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4、product:要创建的复杂对象。
Builder是为创建一个Product对象的各个部件指定的抽象接口,Prodcut是具体的产品。Director是一个建造者,由它指挥使用Builder。ConcreteBuilder是具体的建造,实现Builder接口的各个方法。
应用实例:
1、人的衣着由鞋子、上衣、裤子、帽子等,而其组合是经常变化的,生成出所谓的"搭配"。
2、 在了解之前,先假设有一个问题,我们需要创建一个学生对象,属性有name,number,class,sex,age,school等属性,如果每一个属性都可以为空,也就是说我们可以只用一个name,也可以用一个school,name,或者一个class,number,或者其他任意的赋值来创建一个学生对象,这时该怎么构造?
使用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
二、实例演示
这里以人穿衣搭配为例,需要对每个服装进行搭配,即鞋子、裤子、上衣的搭配;
1、Product(要创建的复杂对象):
/**
* Created by yd on 2019/3/26.
* 装扮由鞋子、裤子、上衣组成
*/
public class PersonDress {
//鞋子
private String shoes;
//裤子
private String trousers;
//上衣
private String jacket;
public String getShoes() {
return shoes;
}
public void setShoes(String shoes) {
this.shoes = shoes;
}
public String getTrousers() {
return trousers;
}
public void setTrousers(String trousers) {
this.trousers = trousers;
}
public String getJacket() {
return jacket;
}
public void setJacket(String jacket) {
this.jacket = jacket;
}
}
2、Builder(给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建):
/**
* Created by yd on 2019/3/26.
* 抽象接口
*/
public interface PersonBuilder {
void buildShoes();
void buildTrousers();
void buildJacket();
//组装
PersonDress buildPersonDress();
}
3、ConcreteBuilder(实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例):
/**
* Created by yd on 2019/3/26.
* 具体穿衣搭配
*/
public class StarBuilder implements PersonBuilder {
private PersonDress personDress;
public StarBuilder(){
personDress = new PersonDress();
}
public void buildShoes(){
personDress.setShoes("穿古驰的鞋");
}
public void buildTrousers(){
personDress.setTrousers("穿LV的裤子");
}
public void buildJacket(){
personDress.setJacket("穿阿玛尼的T恤");
}
public PersonDress buildPersonDress(){
return personDress;
}
}
4、Director(调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建):
/**
* Created by yd on 2019/3/26.
*/
public class PersonDirector {
public PersonDress constructPerson(PersonBuilder personBuilder){
//按照穿衣顺序 裤子--->衣服--->鞋子 的顺序装扮
personBuilder.buildTrousers();
personBuilder.buildJacket();
personBuilder.buildShoes();
return personBuilder.buildPersonDress();
}
//测试
public static void main(String[] args) {
PersonDirector personDirector = new PersonDirector();
PersonDress personDress = personDirector.constructPerson(new StarBuilder());
System.out.println(personDress.getShoes());
System.out.println(personDress.getTrousers());
System.out.println(personDress.getJacket());
}
}
建造者模式适用场景
建造者模式是在当创建复杂对象的复杂算法一个独立与该对象的组成部分以及它们的装配方式时适用的模式。