一、创建产品角色接口:

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

工厂模式-Spring的InitializingBean实现的更多相关文章

  1. 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想

    菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...

  2. 使用工厂模式解耦和IoC思想

    使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...

  3. Java设计模式之工厂模式的两种实现方式

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 1. 为什么要有工厂模式? "Talk i ...

  4. 工厂模式模拟Spring的bean加载过程

    一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...

  5. Spring中的工厂模式和单例模式

    Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A  a  = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...

  6. 从基础知识到重写Spring的Bean工厂中学习java的工厂模式

    1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获 ...

  7. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

  8. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

  9. spring通过工厂模式解决页面耦合问题

    spring通过工厂模式解决页面耦合问题

随机推荐

  1. C#使用 params object[] 将参数个数不一样的方法 集成一个

    getChange("1"); getChange("1","2"); public string getChange(params obj ...

  2. swift hidesBottomBarWhenPushed 设置界面

    方法一(推荐):一级界面push的时候设置,子页面无需设置 let vc = JYMyCommissionController() vc.hidesBottomBarWhenPushed = true ...

  3. hdpi对应分辨率

    ldpi  QVGA (240×320) mdpi  HVGA (320×480) hdpi  WVGA (480×800),FWVGA (480×854) xhdpi  720P(1280*720) ...

  4. bootstrap添加遮罩层loadingmask

    转自:https://blog.csdn.net/baidu_30809315/article/details/83900255 gif动态图下载地址:http://blog.sina.com.cn/ ...

  5. VBA找相似体积的单元格值

    在VBA中做了一个比较体积,如果体积相似就显示隔壁单元格的内容 Function VC(a, b As Range) 'VolumeCompare体积比较 Dim arry() As Variant ...

  6. turtle库的学习笔记

    (1)turtle使用pen来绘制图形 pendown()  放下画笔,移动到指定点后继续绘制 penup()   提起画笔,用于另起一个地方绘制时使用 pensize(width)   设置画笔线条 ...

  7. 利用python监测linux上的服务(简单实现服务宕掉自动发送邮件)

    python 这里用到了四个python 模块 : import time (时间模块) import re (正则模块) import socket (监测端口模块)import yagmail ( ...

  8. JavaScript:原生模拟$.ajax以及jsonp

    现实项目中,常常会用到请求,但是在考虑低版本的浏览器时,promise相关的axios,fetch这类第三方库的支持率就不那么好了,再考虑到最大的一个问题,跨域,更是让人头痛,虽然也有fetch-js ...

  9. UML类图中箭头和线条的含义和用法

    UML类图中箭头和线条的含义和用法 在学习UML过程中,你经常会遇到UML类图关系,这里就向大家介绍一下UML箭头.线条代表的意义,相信通过本文的介绍你对UML中箭头.线条的意义有更明确的认识. AD ...

  10. 叙述 activemq 与spring 主题实现 小功能实现

    在上一篇文章里 我说到了 maven的配置  我现在直接说 xml配置 首先我先描述 生产者的信息 <?xml version="1.0" encoding="UT ...