设计模式-建造者模式Builder
意图
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来
适用性
- 相同的方法,不同的执行顺序,产生不同的事件结果时。
- 多个部件或零件,都可以装配到一个对象中。但是产生的运行结果又不相同时。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。
- 当构造过程必须允许被构造的对象有不同的表示时。
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
结构
Product
:产品类,指要创建的复杂对象,通常实现了模板方法模式。Builder
:抽象建造类,规范产品的组建,一般是由子类实现的。ConcreteBuilder
:具体建造类,实现抽象建造类定义的方法并返回一个建造好的对象。Director
:导演类,也就是指挥者,负责安排流程。
代码
1、家装对象类 Product
/**
* 家装对象类
*/
public class House {
// 买家电
private String jiadian;
// 买地板
private String diban;
// 买油漆
private String youqi;
public String getJiadian() {
return jiadian;
}
public void setJiadian(String jiadian) {
this.jiadian = jiadian;
}
public String getDiban() {
return diban;
}
public void setDiban(String diban) {
this.diban = diban;
}
public String getYouqi() {
return youqi;
}
public void setYouqi(String youqi) {
this.youqi = youqi;
}
@Override
public String toString() {
return "House{" +
"jiadian='" + jiadian + '\'' +
", diban='" + diban + '\'' +
", youqi='" + youqi + '\'' +
'}';
}
}
2、抽象建造者 Builder 类 Builder
/**
* 抽象建造者
*/
public interface HouseBuilder {
// 买家电
void doJiadian();
// 买地板
void doDiBan();
// 买油漆
void doYouqi();
House getHouse();
}
3、具体建造者-简装建造者类 ConcreteBuilder
/**
* 简装创建者
*/
public class JianzhuangBuilder implements HouseBuilder {
private House house = new House();
@Override
public void doJiadian() {
house.setJiadian("简单家电就好");
}
@Override
public void doDiBan() {
house.setDiban("普通地板");
}
@Override
public void doYouqi() {
house.setYouqi("污染较小的油漆就行");
}
@Override
public House getHouse() {
return house;
}
}
4、具体建造者-精装建造者类 ConcreteBuilder
/**
* 精装创建者
*/
public class jingzhuangBuilder implements HouseBuilder {
private House house = new House();
@Override
public void doJiadian() {
house.setJiadian("二话不说,最好的");
}
@Override
public void doDiBan() {
house.setDiban("二话不说,实木地板");
}
@Override
public void doYouqi() {
house.setYouqi("二话不说,给我来0污染的");
}
@Override
public House getHouse() {
return house;
}
}
5、指挥官-家装公司类 Director
/**
* 家装公司,值需要告诉他精装还是简装
*/
public class HouseDirector {
public House builder(HouseBuilder houseBuilder){
houseBuilder.doDiBan();
houseBuilder.doJiadian();
houseBuilder.doYouqi();
return houseBuilder.getHouse();
}
}
6、客户端
public class App {
public static void main(String[] args) {
house();
}
public static void house(){
HouseDirector houseDirector = new HouseDirector();
// 简装
JianzhuangBuilder jianzhuangBuilder = new JianzhuangBuilder();
System.out.println("我要简装");
System.out.println(houseDirector.builder(jianzhuangBuilder));
// 精装
jingzhuangBuilder jingzhuangBuilder = new jingzhuangBuilder();
System.out.println("我要精装");
System.out.println(houseDirector.builder(jingzhuangBuilder));
}
}
优缺点
优点
-
隐藏对象的创建过程,将对象创建过程和对象本身解耦,使用者只需要关心要创建什么样的东西。通过这个例子人工和机器做汤的比较,很明显能发现使用机器能方便很多。现实生活中也是如此(如工厂流水线)。
-
方便扩展。上面也提到了,机器做汤,做什么样的汤取决于选择什么样的程序,如果你想做玉米萝卜汤,那你只需要给机器植入做玉米萝卜汤的程序(即实现SoupProgram接口)。
-
遵循了“开闭原则”。对象应该对扩展开放对修改关闭。
缺点
通过上面的代码,很明显能感觉到,使用这个Builder设计模式以后引入了更多的类和接口,增加了复杂度。
参考
1.设计模式(5)-建造者模式详解(易懂)
2.设计模式:建造者模式(Builder)
3.秒懂设计模式之建造者模式(Builder pattern)
4.设计模式之建造者模式
5.简说设计模式——建造者模式
6.Java 大白话讲解设计模式之 – 建造者(Builder)模式