建造者模式
基本概念
又叫生成器模式,是一种对象构建模式,它可以将复杂对象的创建过程抽取出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。Builder模式可以将一个类的构建和表示进行分离。
建造者模式的四个要素:
- 产品类(Product):一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
- 抽象建造者(Builder):引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
- 建造者(ConcreteBuilder):实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
- 导演类(Director):负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
- 指挥者(Director)直接和客户(Client)进行需求沟通;
- 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
- 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
- 各个具体建造者负责进行产品部件的构建;
- 最终构建成具体产品(Product)。
实例分析
该示例是 Builder模式的常规用法,导演类 Director 在 Builder模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类。
- 创建产品类
class House{
private String basic;
private String wall;
private String roof;
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
}
- 创建Builder抽象类
abstract class HouseBuilder{
protected House house=new House();
public abstract void buildBasic();
public abstract void buildWall();
public abstract void buildRoof();
public House createHouse(){
return house;
};
}
- 创建平房Builder类和高楼Builder类
class CommonHouseBuilder extends HouseBuilder{
@Override
public void buildBasic() {
house.setBasic("平房地基");
}
@Override
public void buildWall() {
house.setWall("平房墙");
}
@Override
public void buildRoof() {
house.setRoof("平房屋顶");
}
}
class HighHouseBuilder extends HouseBuilder{
@Override
public void buildBasic() {
house.setBasic("高楼地基");
}
@Override
public void buildWall() {
house.setWall("高楼墙");
}
@Override
public void buildRoof() {
house.setRoof("高楼屋顶");
}
}
- 创建HouseDirector类
class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder=houseBuilder;
}
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWall();
houseBuilder.buildRoof();
return houseBuilder.createHouse();
}
}
- 客户端利用HouseDirector构建房子
public void test(){
HouseDirector houseDirector=new HouseDirector(new HighHouseBuilder());
House house = houseDirector.constructHouse();
System.out.println(house.getBasic());
}
建造者模式优缺点分析
- 优点
- 使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 具体的建造者类之间是相互独立的,这有利于系统的扩展。
- 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
- 缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
与工厂模式对比
与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
JAVA中的使用
StringBuilder用到了建造者模式