设计模式:工厂模式(接口统一出参与入参,实现类可自定义配置响应参数以及请求参数)

    场景说明:设计生产电视的统一接口,生产每种电视的入参不同,出参也不同;具体来说需要生产小米电视、长虹电视、创维电视,每种电视生产的请求参数不同,生产完成之后的响应参数也不同。想到的统一封装的方法就是创建一接口或是抽象类,每种电视产品的出参或是入参都继承,或使用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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43401380/article/details/112790111