• Spring用InitializingBean实现一个工厂模式


    一、创建产品角色接口:

    package org.burning.sport.design.pattern.factorypattern.spring.factory;
    
    public interface SignService {
        /**
         * 获取签名的工具
         * @return
         */
        EnumSign getSignTool();
    
        /**
         * 签名
         * @param name 用户姓名
         */
        void write(String name);
    
    }

    二、创建产品角色抽象类:

    package org.burning.sport.design.pattern.factorypattern.spring.factory;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public abstract class AbstractSignService implements SignService {
    
        /**
         * 把内容写入到文件中
         * @param content 内容
         */
        public void writeFileContent(String content) {
            File file = new File("d:/test.txt");
            FileOutputStream fos = null;
            try {
                if(file.exists()) {
                    file.delete();
                }
                fos = new FileOutputStream(file);
                fos.write(content.getBytes());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

     三、具体产品角色

    package org.burning.sport.design.pattern.factorypattern.spring.factory.impl;
    
    import org.burning.sport.design.pattern.factorypattern.spring.factory.AbstractSignService;
    import org.burning.sport.design.pattern.factorypattern.spring.factory.EnumSign;
    import org.springframework.stereotype.Component;
    
    @Component
    public class BrushPenSignServiceImpl extends AbstractSignService {
        @Override
        public EnumSign getSignTool() {
            return EnumSign.BRUSH_PEN;
        }
    
        @Override
        public void write(String name) {
            String content = "大家好,我是" + name + ",现在在用毛笔签名";
            writeFileContent(content);
        }
    }
    package org.burning.sport.design.pattern.factorypattern.spring.factory.impl;
    
    import org.burning.sport.design.pattern.factorypattern.spring.factory.AbstractSignService;
    import org.burning.sport.design.pattern.factorypattern.spring.factory.EnumSign;
    import org.springframework.stereotype.Component;
    
    @Component
    public class PencilSignServiceImpl extends AbstractSignService {
        @Override
        public EnumSign getSignTool() {
            return EnumSign.PENCIL;
        }
    
        @Override
        public void write(String name) {
            String content = "大家好,我是" + name + ",现在在用铅笔签名";
            writeFileContent(content);
        }
    }
    package org.burning.sport.design.pattern.factorypattern.spring.factory.impl;
    
    import org.burning.sport.design.pattern.factorypattern.spring.factory.AbstractSignService;
    import org.burning.sport.design.pattern.factorypattern.spring.factory.EnumSign;
    import org.springframework.stereotype.Component;
    
    @Component
    public class PenSignServiceImpl extends AbstractSignService {
        @Override
        public EnumSign getSignTool() {
            return EnumSign.PEN;
        }
    
        @Override
        public void write(String name) {
            String content = "大家好,我是" + name + "现在在用钢笔签名";
            writeFileContent(content);
        }
    }

    四、工厂角色

      SignServiceFactory实现了Spring的InitializingBean方法,在容器启动时,就会运行afterPropertiesSet()方法,通过applicationContext把产品角色都存储到一个HashMap中去

    package org.burning.sport.design.pattern.factorypattern.spring.factory;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Component
    public class SignServiceFactory implements ApplicationContextAware, InitializingBean {
    
        private ApplicationContext applicationContext;
    
        private static Map<EnumSign, SignService> map = new HashMap<>();
    
        public SignService getInstance(EnumSign enumSign) {
            return map.get(enumSign);
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            Map<String, SignService> beansOfType = applicationContext.getBeansOfType(SignService.class);
            for(Map.Entry<String, SignService> entry : beansOfType.entrySet()) {
                map.put(entry.getValue().getSignTool(), entry.getValue());
            }
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    }

    五,客户端访问

    package org.burning.sport.design.pattern.factorypattern.spring.factory;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class ClientTest {
        public static void main(String[] args) {
            ApplicationContext apx = new ClassPathXmlApplicationContext("applicationContext.xml");
            SignServiceFactory signServiceFactory = apx.getBean("signServiceFactory", SignServiceFactory.class);
            SignService signService = signServiceFactory.getInstance(EnumSign.PEN);
            signService.write("红孩儿");
        }
    }

    代码:https://gitee.com/play-happy/base-project

    org.burning.sport.design.pattern.factorypattern.spring.factory
  • 相关阅读:
    linux的redis的安装和使用
    在linux上安装Mysql和使用
    linux的python3的安装
    linux的优化和命令
    LeetCode 542. 01 Matrix
    Qt keyPressEvent
    QOpenGLTexture 两个纹理叠加
    Qt5.6.0+OpenGL 纹理贴图首战告捷
    更改Qt Application为 Qt Console Application
    Learning part-based templates from large collections of 3D shapse CorrsTmplt Kim 代码调试
  • 原文地址:https://www.cnblogs.com/happyflyingpig/p/10030446.html
Copyright © 2020-2023  润新知