Spring用InitializingBean實現一個工廠模式

1、建立產品角色接口:

package org.burning.sport.design.pattern.factorypattern.spring.factory;

public interface SignService {
    /**
     * 獲取簽名的工具
     * @return
     */
    EnumSign getSignTool();

    /**
     * 簽名
     * @param name 用戶姓名
     */
    void write(String name);

}

2、建立產品角色抽象類:

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();
            }
        }
    }
}

 3、具體產品角色

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);
    }
}

4、工廠角色

  SignServiceFactory實現了Spring的InitializingBean方法,在容器啓動時,就會運行afterPropertiesSet()方法,經過applicationContext把產品角色都存儲到一個HashMap中去java

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-projectgit

org.burning.sport.design.pattern.factorypattern.spring.factory
相關文章
相關標籤/搜索