建造者模式和模板方法模式扩展篇
UML
与抽象工厂模式比较
本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢
- 建造者模式关注的是基本方法的调用顺序,而零件(基本方法)已经准备好
- 抽象工厂关注的零件的生产(基本方法的实现),而组装顺序已经确定
实现
产品抽象
public abstract class Product {
public abstract void doSomeThing();
}
产品A
public class AProduct extends Product {
@Override
public void doSomeThing() {
}
}
产品B
public class BProduct extends Product {
@Override
public void doSomeThing() {
}
}
抽象建造者
public abstract class AbstractBuilder {
private List<String> methodList = new ArrayList();
/**
* 建造方法(模板方法)
* 按照定制的执行顺序执行方法
*
* @return
*/
protected abstract Product build();
/**
* 基本方法
*/
protected void methodA(){
}
/**
* 基本方法
*/
protected void methodB(){
}
/**
* 基本方法
*/
protected void methodC(){
}
/**
* 设置建造的内部逻辑(配置零件)
*/
public abstract void setPart();
}
建造者实现
public class ABuilder extends AbstractBuilder {
private List<String> aList = new ArrayList();
private List<String> bList = new ArrayList();
private List<String> cList = new ArrayList();
private Product product = new AProduct();
@Override
protected Product build() {
if(CollectionUtils.isEmpty(aList)){
methodA();
}
if(CollectionUtils.isEmpty(bList)){
methodA();
}
methodC();
// 一些业务逻辑处理
return product;
}
@Override
public void setPart() {
//避免引起逻辑错误
aList.clear();
bList.clear();
cList.clear();
aList.add("A1");
aList.add("A2");
aList.add("A3");
bList.add("B2");
}
}
建造者实现
public class BBuilder extends AbstractBuilder {
private List<String> aList = new ArrayList();
private List<String> bList = new ArrayList();
private List<String> cList = new ArrayList();
private Product product = new BProduct();
@Override
protected Product build() {
if(CollectionUtils.isEmpty(aList)){
methodA();
}
methodC();
if(CollectionUtils.isEmpty(bList)){
methodB();
}
// 一些业务逻辑处理
return product;
}
@Override
public void setPart() {
//避免引起逻辑错误
aList.clear();
bList.clear();
cList.clear();
bList.add("A1");
bList.add("A2");
bList.add("A3");
cList.add("B2");
}
}
导演类,封装实现,避免高层深入具体的建造者接触(可以有多个)
public class Director {
private ABuilder aBuilder = new ABuilder();
private BBuilder bBuilder = new BBuilder();
public Product getAProduct(){
return aBuilder.build();
}
public Product getBProduct(){
return bBuilder.build();
}
}
调用
public class Client {
public static void main(String[] args) {
Director director = new Director();
Product aProduct = director.getAProduct();
aProduct.doSomeThing();
原文地址:https://www.cnblogs.com/dakunqq/p/11707562.html
时间: 2024-10-15 00:28:20