• 设计模式之工厂模式


    设计模式之简单工厂模式

    工厂模式分为简单工厂,工厂方法,抽象工厂。今天探讨简单工厂模式

    1. 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,属于创建型模式,但它不属于GOF,23种设计模式。
    2. 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行 为(代码)
    3. 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会 使用到工厂模式

    业务需求:
    现在登录方式分为oauth2,jwt,cas。现在有一张模板基础表叫ids_app_info,三张与之对应的模板详情表:ids_app_jwt_template、ids_app_cas_template、ids_app_oauth_template。添加一个模板的应用时会有基础数据和模板详情数据。那么,基础数据插入ids_app_info后,具体模板详情数据如何插入对应的模板表?

    看简单工厂模式的实现:
    先看类图:
    在这里插入图片描述

    1.写一个工厂类

    作用是存放对象和取出对象

    @Component
    public class TemplateFactory {
    
        private ConcurrentHashMap<String, TemplateService> map = new ConcurrentHashMap<>();
    
        public void setTemplate(String type, TemplateService templateService) {
            map.putIfAbsent(type, templateService);
        }
        public TemplateService getTemplate(String type) {
            return map.get(type);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    2.写一个父接口和抽象类
    public interface TemplateService {
        void insertTemplate(String templateStr);
    }
    
    • 1
    • 2
    • 3

    抽象类隔开父接口与实现类的目的是为了写一些公共的方法在此。

    public abstract class AbstractTemplateService implements TemplateService{
    
    }
    
    • 1
    • 2
    • 3
    3. 3个实现类
    @Service("idsAppCasTemplateService")
    public class IdsAppCasTemplateServiceImpl extends AbstractTemplateService implements InitializingBean {
    
        @Resource
        private TemplateFactory templateFactory;
        @Resource
        private IdsAppCasTemplateDao casTemplateDao;
    
        @Override
        public void afterPropertiesSet() throws Exception {
            templateFactory.setTemplate(TemplateEnum.CAS_TEMPLATE.getCode(), this);
        }
        @Override
        public void insertTemplate(String templateStr) {
            IdsAppCasTemplateEntity casTemplateEntity = JSON.parseObject(templateStr, IdsAppCasTemplateEntity.class);
            casTemplateDao.insert(casTemplateEntity);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    @Service("idsAppJwtTemplateService")
    public class IdsAppJwtTemplateServiceImpl extends AbstractTemplateService implements InitializingBean {
    
        @Resource
        private TemplateFactory templateFactory;
        @Resource
        private IdsAppJwtTemplateDao jwtTemplateDao;
        @Override
        public void afterPropertiesSet() throws Exception {
            templateFactory.setTemplate(TemplateEnum.JWT_TEMPLATE.getCode(),this);
        }
        @Override
        public void insertTemplate(String templateStr) {
            IdsAppJwtTemplateEntity jwtTemplateEntity = JSON.parseObject(templateStr, IdsAppJwtTemplateEntity.class);
            jwtTemplateDao.insert(jwtTemplateEntity);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    @Service("idsAppOauthTemplateService")
    public class IdsAppOauthTemplateServiceImpl extends AbstractTemplateService implements InitializingBean {
    
        @Resource
        private TemplateFactory templateFactory;
        @Resource
        private IdsAppOauthTemplateDao oauthTemplateDao;
        @Override
        public void afterPropertiesSet() throws Exception {
            templateFactory.setTemplate(TemplateEnum.OAUTH_TEMPLATE.getCode(),this);
        }
        @Override
        public void insertTemplate(String templateStr) {
            IdsAppOauthTemplateEntity appOauthTemplate = JSON.parseObject(templateStr,IdsAppOauthTemplateEntity.class);
            oauthTemplateDao.insert(appOauthTemplate);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    4.业务需求要分支到对应实现类时如何实现的?
     @Override
        public RespResult<Void> add(AppInfoDTO appInfoDTO) {
    
            RespResult<Void> result = new RespResult<>();
            ServiceTemplate.executeApiService(
                    getClass(),
                    AppSceneEnum.API_TEACHER_ADDTEACHER,
                    appInfoDTO,
                    result,
                    request -> {
                        IdsAppInfoEntity idsAppInfoEntity = new IdsAppInfoEntity();
                        BeanUtils.copyProperties(appInfoDTO,idsAppInfoEntity);
                        idsAppInfoMapper.insert(idsAppInfoEntity);
                        String templateType = appInfoDTO.getTemplateType();
                        //根据templateType获取对应的实现类,向上造型成父类(就是那个父接口)
                        TemplateService template = templateFactory.getTemplate(templateType);
                        //父类的对象点方法(子类是哪个实现类那么就会进入哪个实现类的方法)
                        template.insertTemplate(appInfoDTO.getTemplateStr());
                    });
            return result;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    git基本命令
    HPA (Horizontal Pod Autoscaler) In K8s
    PDF文件压缩软件 PDF Squeezer mac中文版​软件特点
    接口自动化框架脚手架-利用反射机制实现接口统一发起端
    【网络技术】【Kali Linux】Wireshark嗅探(十一)以太网Ethernet协议报文捕获及分析
    软考高级五大证书,哪个更值得考?
    yolov8使用opencv2实时检测,两种物品,左上角显示信息
    【总线】AXI第十课时:AXI协议的Ordering Model 使用ID tag
    线程创建方式
    大数据之初识Doris(一)
  • 原文地址:https://blog.csdn.net/m0_37635053/article/details/127642749