一。
定义:由一个工厂对象决定创建出哪一个产品类的实例
类型:创建型,但不属于go23种设计模式
二。使用场景
工厂类负责创建的对象较少
客户端(应用层)只知道传入工厂类的参数,对于如何创建对象逻辑不关心
优点:
只需要传入一个正确的参数,就可以获取对象,不需要知道创建细节
缺点:工厂类职责过重,增加新的产品,需要修改工厂类的判断逻辑,违背了开闭原则
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。定义:所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。
1.定义一个回调接口:
public interface HandleCallBack {
/** 参数校验 */
public void checkParams();
/** 执行待处理操作,比如模型的创建,修改,删除等 */
public void process();
}
里面定义了需要执行的2个接口方法,参数校验与执行操作。
2.定义一个处理模板类:定义静态方法,可以直接模板调用
public class HandleTemplate {
/** logger */
private static final Logger logger = Logger.getLogger(LoggerNames.TestLogger);
/**
* 执行(调用者要实现回调)[执行器]
* @param result 结果(可以对结果进行处理)
* @param callBack 回调
*/
public static <T> void execute(Object result, HandleCallBack callBack) {
try {
// 1.执行业务参数校验
{
Profiler.enter("执行参数校验")
try {
callBack.checkParams();
} finally {
Profiler.release();
}
}
// 2. 执行业务操作
{
Profiler.enter("执行业务操作");
try {
callBack.process();
} finally {
Profiler.release();
}
}
//业务处理成功
setResultSuccessResultCode(result);
}catch(Exception e){ LoggerUtil.warn(logger, e); setResult(result, e,true); }
}
3.直接在需要用的地方直接通过静态调用即可,完成业务处理HandleTemplate.execute(orderResult, new HandleCallBack() {
/**
* @see HandleCallBack#checkParams()
*/
@Override
public void checkParams() {
{
// 这里只判断是否为空,每个字段的校验下
// 沉到通用校验组件里
checkNotNull(testRequest, tsetContext);
// 检查产品码是否有效
checkProductValid(testRequest);
}
}
/**
* @see HandleCallBack#process()
*/
@Override
public void process() {
try {
// 获取事务,默认仅有引擎层事务
TransactionTemplateRouter.getTransactionTemplate()
.execute(new TransactionCallbackWithoutResult() {
/**
* @see TransactionCallbackWithoutResult#doInTransactionWithoutResult(TransactionStatus)
*/
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
execute(testContext);
}
});
}
});