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
posted @ 2018-11-30 18:30  寻找风口的猪  阅读(917)  评论(0编辑  收藏  举报