场景说明:设计生产电视的统一接口,生产每种电视的入参不同,出参也不同;具体来说需要生产小米电视、长虹电视、创维电视,每种电视生产的请求参数不同,生产完成之后的响应参数也不同。想到的统一封装的方法就是创建一接口或是抽象类,每种电视产品的出参或是入参都继承,或使用map形式,根据每种不同的产品进行个性化添加;
代码结构图:
电视生产统一接口:
public interface ProductTV {
// 场景说明:生产电视的统一接口,生产每种电视的入参不同,出参也不同,
// 想到的统一封装的方法就是创建一接口或是抽象类,每种电视产品的出参或是入参都继承,或使用map形式,根据每种不同的产品进行个性化添加;
// 响应参数采用接口方式,请求参数使用map方式
/**
* @Author: txm
* @Description: 生产电视
* @Param: [requestTVParam]
* @return: com.it.tao.design.factoryDesign.ResponseTVParam
* @Date: 2021/1/18 17:53
**/
ResponseTVParam productTV(Map<String,String> requestTVParam);
}
电视生产接口响应参数
public interface ResponseTVParam {
// 电视产品响应参数顶级父类
}
以长虹电视为例,需要提供生产响应参数以及生成电视接口的实现类,小米以及创维同理
长虹电视生产响应参数:
public class ChangHongResponseParam implements ResponseTVParam {
// 长虹电视生产完之后需要的参数
}
长虹电视生成电视接口的实现类:
public class ChangHongTVProduct implements ProductTV {
// 生产长虹电视
@Override
public ResponseTVParam productTV(Map<String, String> requestTVParam) {
// 获取长虹生产电视请求参数
// 长虹电视生产逻辑
// 组装长虹电视响应参数
ChangHongResponseParam changHongResponseParam = new ChangHongResponseParam();
System.out.println("长虹电视生产已完成");
return changHongResponseParam;
}
}
小米电视生产相关类:
public class XiaoMiResponseParam implements ResponseTVParam {
// 小米电视生产完之后需要的参数
private int xiaomiResParam1;
private int xiaomiResParam2;
private int xiaomiResParam3;
// 省略set/get
}
public class XiaoMiTVProduct implements ProductTV {
// 生产小米电视
@Override
public ResponseTVParam productTV(Map<String, String> requestTVParam) {
// 获取小米生产电视请求参数
// 小米电视生产逻辑
// 组装小米电视响应参数
XiaoMiResponseParam xiaoMiResponseParam = new XiaoMiResponseParam();
System.out.println("小米电视生产已完成");
return xiaoMiResponseParam;
}
}
创维电视生产相关类:
public class ChuangWeiResponseParam implements ResponseTVParam {
// 创维电视生产完之后需要的参数
}
public class ChuangWeiTVProduct implements ProductTV {
// 生产创维电视
@Override
public ResponseTVParam productTV(Map<String, String> requestTVParam) {
// 获取创维生产电视请求参数
// 创维电视生产逻辑
// 组装创维电视响应参数
ChuangWeiResponseParam chuangWeiResponseParam = new ChuangWeiResponseParam();
System.out.println("创维电视生产已完成");
return chuangWeiResponseParam;
}
}
便于拓展将电视类型添加到枚举中,也可以从工厂类中使用if-else进行嵌套。
public enum TVTypeEnum {
xiaomi("小米",new XiaoMiTVProduct()),
changhong("长虹",new ChangHongTVProduct()),
chuangwei("创维",new ChuangWeiTVProduct());
private String tvName;
private ProductTV productTV;
TVTypeEnum(String tvName,ProductTV productTV) {
this.tvName=tvName;
this.productTV=productTV;
}
public String getTvName() {
return tvName;
}
public void setTvName(String tvName) {
this.tvName = tvName;
}
public ProductTV getProductTV() {
return productTV;
}
public void setProductTV(ProductTV productTV) {
this.productTV = productTV;
}
// 根据电视名称获取对应电视生产接口
public static ProductTV getProductTVInfo(String tvName){
TVTypeEnum[] tvTypes = TVTypeEnum.values();
for (TVTypeEnum tvType : tvTypes) {
if(tvName.equals(tvType.getTvName())){
return tvType.getProductTV();
}
}
return null;
}
}
电视生产工厂以及测试示例:
public class TVProductFactory {
// 根据电视名称执行生产指定电视
public ProductTV getProductTV(String tvName){
// 此处使用枚举获取对应的电视类型,也可以使用if-else进行嵌套
// 根据电视名称获取生产电视接口
return TVTypeEnum.getProductTVInfo(tvName);
}
// 测试工厂类
public static void main(String[] args) {
// 利用工厂根据电视名称获取电视接口
TVProductFactory tvProductFactory = new TVProductFactory();
ProductTV xiaomi = tvProductFactory.getProductTV("小米");
// 组装小米电视生产请求参数
HashMap<String, String> xiaomiReqRaram = new HashMap<>();
ResponseTVParam responseTVParam = xiaomi.productTV(xiaomiReqRaram);
}
}