设计模式之建造者模式
2020-03-08 本文已影响0人
成为一个无趣的人
设计模式之建造者模式
1. 模式定义
建造者模式又可以成为生成器模式,它属于对象创建型模式。建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它一步一步创建一个复杂对象,而且允许用户只通过指定复杂对象的类型和内容就可以构建他们,而不需要知道内部构建细节[1]
- [1] 图说设计模式
2. UML
类图

3. 代码描述
package com.lemon.builder;
import lombok.Data;
/**
* @author Hello
* @description 复杂产品,由组件ABC构成
* @date 2020-03-08 09:23
*/
@Data
public class Product {
private Object componentA;
private Object componentB;
private Object componentC;
}
package com.lemon.builder;
/**
* @author Hello
* @description
* @date 2020-03-08 09:22
*/
public abstract class AbstractBuilder {
public abstract Object buildA();
public abstract Object buildB();
public abstract Object buildC();
}
package com.lemon.builder;
/**
* @author Hello
* @description 具体建造者A
* @date 2020-03-08 09:22
*/
public class BuilderA extends AbstractBuilder{
@Override
public Object buildA() {
return "建造者A建造的组件A";
}
@Override
public Object buildB() {
return "建造者A建造的组件B";
}
@Override
public Object buildC() {
return "建造者A建造的组件C";
}
}
package com.lemon.builder;
/**
* @author Hello
* @description 具体建造者B
* @date 2020-03-08 09:22
*/
public class BuilderB extends AbstractBuilder{
@Override
public Object buildA() {
return "建造者B建造的组件A";
}
@Override
public Object buildB() {
return "建造者B建造的组件B";
}
@Override
public Object buildC() {
return "建造者B建造的组件C";
}
}
package com.lemon.builder;
/**
* @author Hello
* @description 指挥者,负责直接与客户端交互,建造产品
* @date 2020-03-08 09:23
*/
public class Director {
private AbstractBuilder builder;
public Director(AbstractBuilder builder) {
this.builder = builder;
}
public Product build() {
Product product = new Product();
product.setComponentA(builder.buildA());
product.setComponentB(builder.buildB());
product.setComponentC(builder.buildC());
return product;
}
}
4. 举个栗子
直接看类图和代码可能还不够直观,理解起来有困难,那么我们还是举个栗子。假设你去奶茶店购买饮品,你对奶茶妹妹说,一杯珍珠奶茶,不加珍珠,七分糖。奶茶妹妹虽然一脸懵逼,但还是拿起了调制珍珠奶茶的杯子,加奶、加茶再加七分糖,至此,你的珍珠奶茶也就做好了。在这个过程中,你相当于客户类,奶茶妹妹相当于指挥者类,调制奶茶的杯子相当于具体建造者,假如该奶茶店还有牛奶、咖啡、水果茶等饮品,那么也应该有牛奶具体建造者、咖啡具体建造者、水果茶具体建造者。奶茶妹妹每次只需要更换代表具体建造者的杯子,就能按客户需求调制不同的饮品。
5.总结
- 在建造者模式中,客户端不必知道产品内部的细节,将产品本身与产品的创建过程解耦,是的相同的创建过程可以创建不同的产品对象。
- 每一个具体建造者都相对独立,因此可以很方便地替换具体建造者或新增具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
- 可以更加精细地控制产品地创建过程。
- 增加新的具体建造者无需修改原有类库地代码,指挥者针对抽象建造者编程,系统扩展方便,符合“开闭原则”。
- 建造者模式所创建的产品一般具有较多相同的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式。
- 如果产品地内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。