概念:
建造者模式它分离对象子组件的单独构造和装配。从而可以构造出复杂的对象。简单来说就是不直接生产想要的对象,而是让客户端利用所有必要的参数调用构造器,得到一个builder对象。最后客户端调用无参的build方法来生产不可变的对象,这个bulider是它构建的类的静态成员类。与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
建造者模式通常包括下面几个角色:
1.Builder:抽象建造者。它声明为创建一个Product对象的各个部件指定的抽象接口。
2.ConcreteBuilder:具体建造者。实现抽象接口,构建和装配各个部件。
3.Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
4.Product:产品角色。一个具体的产品对象。
适用性:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
生活中例子:
去吃麦当劳,一般都有汉堡、可乐、薯条、炸鸡翅等食物,这些食物是它必须卖的不可变的。唯一经常变化的是组合不一样,从而就生成出所谓的"套餐"。
示例:
通过一个创建人的例子我们一起来了解一下建筑模式到底是怎么一回事。人的组成由头、身体、脚构成。
建造者模式角色之Product:
public class Person {
//头
private String head;
//身体
private String body;
//脚
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
建造者模式角色之Builder:组成人的具体方法
public interface PersonBuilder {
void buildHead();
void buildBody();
void buildFoot();
Person buildPerson();
}
建造者模式角色之ConcreteBuilder:Builder的具体实现类, 该类继承PersonBuilder
, 并实现了抽象方法。
public class ConcreteBuilder implements PersonBuilder {
Person person;
public ConcreteBuilder(){
person=new Person();
}
@Override
public void buildBody() {
person.setBody("建造人的身体");
}
@Override
public void buildFoot() {
person.setFoot("建造人的脚");
}
@Override
public void buildHead() {
person.setHead("建造人的头");
}
@Override
public Person buildPerson() {
return person;
}
}
建造者模式角色之ConcreteBuilder:改类只负责具体的建造过程, 对结果什么样不关心。
public class PersonDirector {
public Person constructPerson(PersonBuilder personBuilder) {
personBuilder.buildHead();
personBuilder.buildBody();
personBuilder.buildFoot();
return personBuilder.buildPerson();
}
}
测试:
public class Test{
public static void main(String[] args) {
PersonDirector pd = new PersonDirector();
Person person = pd.constructPerson(new ConcreteBuilder());
System.out.println(person.getBody());
System.out.println(person.getFoot());
System.out.println(person.getHead());
}
}
最后借用大话模式的两张截图来看看具体的表现