工厂模式-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
工厂模式-Spring的InitializingBean实现的更多相关文章
- 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...
- 使用工厂模式解耦和IoC思想
使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...
- Java设计模式之工厂模式的两种实现方式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 1. 为什么要有工厂模式? "Talk i ...
- 工厂模式模拟Spring的bean加载过程
一.前言 在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...
- Spring中的工厂模式和单例模式
Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A a = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...
- 从基础知识到重写Spring的Bean工厂中学习java的工厂模式
1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式: 单例模式是指控制其他对象获 ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
- Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...
- spring通过工厂模式解决页面耦合问题
spring通过工厂模式解决页面耦合问题
随机推荐
- 腾讯云主机的公网无法访问,putty和FileZilla连接不上
1.解决方法一(之前百度都是这种安全组忘了添加) 2.解决方案二(ps:我是用centos的,然后不知道为什么访问不了,端口也是全部开的) service network restart 重置网络命令 ...
- abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
在测试项目的ServiceCollectionRegistrar类提前注册.
- osg探究补充:DatabasePager类简介
简介 DatabasePager类,也就是常说的数据库分页技术,简单来说,就是在进行数据库查找时,有可能满足条件的数据很多,为了提高相应速度我们进行数据查找时进行分页查找与显示,当点击下一页时才会进行 ...
- [SoapUI] 检查测试步骤的类型或者或者某种特定类型的步骤列表
SoapUI Groovy : Check if test step is of specific type, such as : Wsdl, Rest, Jdbc, HTTP, Groovy etc ...
- 1.编译cartographer ROS
1.系统要求 cartographer ROS与Cartographer要求一样,即 64-bit, modern CPU (e.g. 3rd generation i7) 16 GB RAM Ubu ...
- solr7.7.0搜索引擎使用(四)(搜索语法)
solr搜索语法 参数defType 指定用于处理查询语句(参数q的内容)的查询解析器,eg:defType=lucenesort 指定响应的排序方式:升序asc或降序desc.同时需要指定 ...
- OpenSessionViewFilter
OpenSessionViewFilter是spring提供的一个针对hibernate的一个支持类,其主要的意思是=在发起一个页面请求的时候打开session,并且保持session直到请求结束,具 ...
- 安装zookeeper(单机,伪集群)
1.登陆zookeeper官网下载 https://zookeeper.apache.org/ zookeeper-3.4.8.tar.gz 解压:tar -zxvf zookeeper-3.4.8. ...
- Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)
目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...
- STM32外设初始化步骤
1.定义外设结构体: 2.开启外设时钟: 3.调用缺省值配置函数: 4.外设具体配置: 5.外设使能.