模板方法设计模式属于行为模式的分类,为啥要使用设计模式?
使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题,让我们的代码更直观和优雅。
模板方法模式和策略模式都有相同之处就是有具体的行为实现,所以也是基于工厂模式的实现。
实际应用场景:工厂物料采购,金融支付,第三方数据采集,回调。都可以使用模板方法模式来构建。
某汽车生产厂家,需要采购一批物料,物料,清单,列入打印机材料,上位erp清单材料,还有汽车生产厂家物材,还有仓库硬件设备材料。对应不同的生产厂家,不同的采购方式和流程都会不一样。我们可以用工厂抽取去行为方法,让不同的子类工厂去实现不同的方式,从而达到高类聚,低耦合的方式满足设计模式的原则。
实现原则:实现原则的本身是由工厂提供方法,具体行为实现由特性去实现
汽车生产厂家需要其他公司提供服务和策略。
A公司打印服务
B公司上位物料
C公司汽车配件
静态工厂实现:
package com.xy.design.template.factory;
import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.config.ApplicationContextProvider;
/**
* <p>
* 模板工厂
* @author xy
* @since 2021-11-02
*/
public class TemPlateFactory {
/**
* 静态工厂实现
* @param templateId
* @return
*/
public static TemplateAbstract getTeamplateFactory(String templateId){
TemplateAbstract templateAbstract = (TemplateAbstract) ApplicationContextProvider.getBean(templateId);
return templateAbstract;
}
}
抽象工厂:
package com.xy.design.template.abstracts;
/**
* <p>
* 抽象工厂
* @author xy
* @since 2021-10-21
*/
public abstract class TemplateAbstract {
/**
* 采购
*/
public abstract String procurement();
/**
* 结算
*/
protected abstract void settlement();
}
工厂实现:
package com.xy.design.template.factory.impl;
import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.common.Constants;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 上位工厂
*/
@Service(Constants.UPPER_PLAN)
@Component
public class UpperFactory extends TemplateAbstract {
@Override
public String procurement() {
return "采购了上位材料----------------";
}
@Override
protected void settlement() {
System.out.println("上位结算单-------------------");
}
}
package com.xy.design.template.factory.impl;
import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.common.Constants;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 打印工厂
*/
@Service(Constants.PRINT_ARRE)
@Component
public class PrintFactory extends TemplateAbstract {
@Override
public String procurement() {
return "采购了大量打印耗材";
}
@Override
protected void settlement() {
System.out.println("打印结算单-------------------");
}
}
package com.xy.design.template.factory.impl;
import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.common.Constants;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 汽车工厂
*/
@Service(Constants.CAR_F)
@Component
public class CarFactory extends TemplateAbstract {
@Override
public String procurement() {
return "采购了大量汽车零件";
}
@Override
protected void settlement() {
System.out.println("汽车结算单-------------------");
}
}
实现类:我们通过静态工厂指定具体实现就可以了。
package com.xy.design.template.service;
import com.xy.design.template.abstracts.TemplateAbstract;
import com.xy.design.template.config.ApplicationContextProvider;
import com.xy.design.template.factory.TemPlateFactory;
import org.springframework.stereotype.Service;
/**
* <p>
*
* @author xy
* @since 2021-11-02
*/
@Service
public class TourismServiceImpl implements TourismService {
@Override
public String procurement(String templateId) {
TemplateAbstract templateAbstract = TemPlateFactory.getTeamplateFactory(templateId);
return templateAbstract.procurement();
}
}
模板方法模式基于行为模式,模板方法模式和策略模式有共同的特性,都是通过Factory工厂实现,也是用到了抽象和继承。抽象类抽象出方法,定义模板方法,具体的逻辑步骤交给实现工厂去实现,从而达到了骨架逻辑的抽离。