公司一个酒店有多个供应商, 采用了设计模式,
接口是 HotelDataInterface , 4 个实现类.
使用 getHotelDataService(String code) 来得到对应的供应商的实现类.
/**
* 这是一个数据提供工厂负责提供数据的
* @version 1.0 2010-9-27
* @author ixr_wang(mail@ixr.name)
*/
@Controller
public class HotelDataFactory implements ApplicationContextAware{
/** 默认数据提供者 */
private static final String DEFALUT_CODE = HotelDataFactory.HotelServiceCodeFinal.WRRRR;
/** 服务商集合 */
private Map<String, HotelDataInterface> hotelDataMap = new HashMap<String, HotelDataInterface>();
/** 根据服务代码获取酒店服务商 */
public HotelDataInterface getHotelDataService(String code){
if(hotelDataMap.containsKey(code)){
return hotelDataMap.get(code);
}else{
return getDefalutHotelDataInterface();
}
}
/** 加载服务商 */
@PostConstruct
public void init(){
Map<?,?> hotelDataMap = context.getBeansOfType(HotelDataInterface.class);
for (Object item : hotelDataMap.values()) {
HotelDataInterface hotelDataItem = (HotelDataInterface) item;
this.hotelDataMap.put(hotelDataItem.getCode(), hotelDataItem);
}
}
/** 获取默认数据提供商 */
public HotelDataInterface getDefalutHotelDataInterface(){
return getHotelDataService(DEFALUT_CODE);
}
//////////////////////////////////////////////////////////////////////////////////////////////
/** SPRING上下文 */
private ApplicationContext context = null;
/** 设置SPRING上下文 */
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
/** 供应商CODE定义 */
public static class HotelServiceCodeFinal{
/** XXX */
public static final String WRRRR = "wssss";
/**XXXX */
public static final String HSSSS1 = "110";
/** XXXX */
public static final String MCCCO = "311";
}
以上代码中,
实现了 ApplicationContextAware 接口, 这个接口提供了获得 BEAN 实例的 SPRING 上下文环境.
beans
包提供了以编程的方式管理和操控bean的基本功能,而context
包下的 ApplicationContext
以一种更加面向框架的方式增强了BeanFactory
的功能。多数用户可以采用声明的方式来使用ApplicationContext
,甚至不用手动创建它,而通过ContextLoader
这样的支持类,把它作为J2EE
web应用的一部分自动启动。当然,我们仍然可以采用编程的方式创建一个ApplicationContext。
context包的核心是ApplicationContext
接口。它由BeanFactory
接口派生而来,因而提供了BeanFactory
所有的功能。为了以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,context包还提供了以下的功能:
-
MessageSource
, 提供国际化的消息访问
-
资源访问
,如URL和文件
-
事件传播
,实现了ApplicationListener
接口的bean
-
载入多个(有继承关系)上下文
,使得每一个上下文都专注于一个特定的层次,比如应用的web层
简单的说:除非你有更好的理由,否则尽量使用 ApplicationContext
,下面是对于哪些"为什么"等等更深入的建议
ApplicationContext
包含BeanFactory
的所有功能。通常建议比BeanFactory
优先,除非有一些限制的场合如字节长度对内存有很大的影响时(Applet
)。然后,绝大多数"典型的"企业应用和系统,ApplicationContext
就是你需要使用的。Spring2.0及以上版本,大量
使用了link
linkend="beans-factory-extension-bpp">BeanPostProcessor
扩展(以便应用代理等功能),如果你选择BeanFactory
则无法使用相当多的支持功能,如事务和AOP,这可能会导致混乱,因为配置并没有错误。
在服务器启动时, 系统调用
/** 加载服务商 */
@PostConstruct
public void init()
@PostConstruct注解
@PostConstruct是Java EE 5引入的注解,Spring允许开发者在受管Bean中使用它。当DI容器实例化当前受管Bean时,@PostConstruct注解的方法会被自动触发,从而完成一些初始化工作。
初始化类 . 其中调用了Spring的
context.getBeansOfType(HotelDataInterface.class);
这个方法可以根据接口自动寻找所有的实现类,封装到MAP中 , key是类名, (XXXImpl), value是实现类。
接口中, 定义这个方法, getCode() 把相应的自己定义的 KEY 返回
分享到:
相关推荐
简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但...在Sunny软件公司的图表库场景中,采用简单工厂模式可以显著改善代码结构,提高代码的可读性和可维护性,同时降低类之间的耦合度,便于未来扩展。
总的来说,简单工厂模式是一种基础且实用的设计模式,尤其适用于对象创建过程较为复杂,且希望将创建过程与使用过程分离的场景。在实际开发中,我们可以结合其他设计模式,如策略模式、工厂方法模式等,以适应更复杂...
在这个例子中,我们将深入探讨工厂模式的C++实现,并以创建不同子公司为例来阐述其工作原理。 工厂模式的主要目标是将对象的创建过程封装起来,使得客户端代码无需关心具体的对象实现,只需知道所使用的接口即可。...
设计模式公司出品的《JAVA设计模式》书籍,详细介绍了多种设计模式,适合不同水平的程序员学习和使用。 首先,我们来了解什么是设计模式。设计模式是软件开发过程中遇到的某一类问题的典型解决方案。它们通常被分为...
文件"MatManual"可能包含了更详细的MTK工程模式操作指南,包括如何进入和退出工程模式,以及如何使用各个测试项的具体步骤。对于想要深入理解和使用MTK工程模式的用户,仔细阅读这份手册将是非常有益的。请确保在...
在软件开发领域,设计模式是一种经过验证的解决常见问题的模板,它们是经验的结晶,为...在实际项目中,根据需求选择合适的设计模式,能有效提高代码的灵活性和可读性,这也是为什么设计模式是公司技术要求的一部分。
JS工厂模式是面向对象设计中的一种经典设计模式,它的主要目的是通过封装对象的创建过程,使得客户端代码在不关心具体对象类型的情况下,能够方便地获取所需的对象。在JavaScript中,工厂模式的应用尤其重要,因为...
以电器工厂为例,假设我们有海尔和TCL两家电器公司,每家公司都可以生产电视机和空调两种产品。在抽象工厂模式下,我们可以定义一个抽象工厂类`ElectronicsFactory`,它声明了创建电视机和空调的方法。然后,我们...
简单工厂模式是设计模式中的结构型模式之一,它的主要目的是提供一个创建对象的公共接口,以便隔离实例化过程,并允许客户端代码请求所需的对象,而无需了解具体类的实现细节。在这个计算器程序中,简单工厂模式可能...
接下来,我们创建工厂类`CompanyFactory`,它是简单工厂模式的核心,负责根据输入条件(如公司类型)创建相应的子公司实例: ```cpp class CompanyFactory { public: static std::unique_ptr<Company> ...
27.3.3 解释器模式使用的场景 27.3.4 解释器模式的注意事项 27.4 最佳实践 第28章 享元模式 28.1 内存溢出,司空见惯 28.2 享元模式的定义 28.3 享元模式的应用 28.3.1 享元模式优点和缺点 28.3.2 享元模式的应用 ...
本实验的目的是熟练使用面向对象设计原则对系统进行重构,并使用 PowerDesigner 等工具和任意一种面向对象编程语言实现几种常见的创建型设计模式和结构型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、...
在Android系统中,工程模式(Engineering Mode)是一种特殊的功能,主要供开发人员和维修技术人员使用。它提供了深入的设备信息,如硬件测试、诊断工具、系统日志等,这些都是普通用户模式下无法访问的。本篇文章将...
设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可复用的解决方案。在给定的压缩包文件中,我们关注的是三种特定的创建型设计模式:简单工厂模式、工厂方法模式以及抽象工厂模式。这三种模式都是...
在酒店管理系统中,我们可以在业务逻辑层中使用工厂模式。例如,创建一个`RoomFactory`,这个工厂可以根据传入的参数(如房间类型)来创建对应的`Room`对象。这样,当需要增加新的房间类型时,只需要扩展工厂,而...
Moto Z1是一款由摩托罗拉公司推出的CDMA机型,其工程模式是为专业技术人员和高级用户设计的特殊功能区,可以用来进行设备诊断、硬件测试以及一些系统级别的调整。以下是两种进入Moto Z1工程模式的方法: 方法一:...
在软件工程领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。工厂模式是其中最常用的一种创建型设计模式,它的核心思想是提供一个接口或抽象类,用于创建相关或依赖对象的家族,而无需指定...
Java抽象工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,一个工厂接口用于创建一系列相关的或相互依赖的对象,而无需指定它们的具体类。这种模式让代码与具体实现解耦,使得...
在互联网背景下,工厂型代理记账作为一种新兴的运营模式,正在改变传统会计行业的工作方式。互联网技术的发展使得会计业务的处理更加高效和精确,尤其是在大数据和云计算的支持下,工厂型代理记账实现了代理记账流程...