简单工厂模式使用ResourceBundle读取.properties配置文件

在做项目时,遇到需要创建DAO、Service等类的实例的时候,想到用工厂方法来运作,而简单工厂方法又有明显的缺点:

①由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;

②它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

③当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

所以考虑使用配置文件+java反射机制来动态创建类的实例,具体思路如下:

通过读取本地的.properties文件来获取我们需要实例化的类,然后通过反射来生成对象,这样当你把发布出去的时候,使用者只用更改配置文件就可以让工厂去实例化自己后来才写的实现类。

使用该方法也就解决了上述问题中:当实体增多时,工厂类需要重新编写的问题了。

先来介绍一下.properties文件

在Java中,使用一种以.properties为扩展名的文本文件作为资源文件,该类型的文件的内容格式为类似: 

#注释
key=value

#为注释,ResourceBundle处理时会自动忽略,对于key=value,应用较多的是数据库的配置文件,比如这样:

#数据库配置信息
DRIVER=com.mysql.jdbc.Driver
URL=jdbc:mysql://localhost:3306/cns
user=test
password=test

而在这里,需要记录的就是  key(  你的实体类名)=value(该类的具体路径),这里的value用于反射中forName(String className)来加载该类。

java.util.ResourceBundle

这个类提供软件国际化的捷径。通过此类,可以使您所编写的程序可以:

轻松地本地化或翻译成不同的语言

一次处理多个语言环境

以后可以轻松地进行修改,支持更多的语言环境

说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。

使用这个类,要注意的一点是,这个properties文件的名字是有规范的:一般的命名规范是: 自定义名_语言代码_国别代码.properties,

如果是默认的,直接写为:自定义名.properties

比如:

myres_en_US.properties
myres_zh_CN.properties

myres.properties

当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在,则优先会使用myres_zh_CN.properties,当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。

没有提供语言和地区的资源文件是系统默认的资源文件。

资源文件都必须是ISO-8859-1编码,因此,对于所有非西方语系的处理,都必须先将之转换为Java Unicode Escape格式。转换方法是通过JDK自带的工具native2ascii.

好吧,上边这部分是我粘过来的,目前我还用不到上述的国际化功能,所以我只关注于用它来读取默认文件。

直接上代码:

import java.util.ResourceBundle;

public class BeanFactory {

    // 加载配置文件
    private static ResourceBundle bundle;
    static {
        bundle = ResourceBundle.getBundle("instance");
    }

    /**
     * 根据指定的key,读取配置文件获取类的全路径; 创建对象
     *
     */
    public static <T> T getInstance(String key,Class<T> clazz) {
        String className = bundle.getString(key);
        try {
            return (T) Class.forName(className).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

其中

 bundle = ResourceBundle.getBundle("instance");

instance是我的资源文件名称,全名是instance.properties

然后再通过指定的key来获取具体的类名

 bundle.getString(key)

之后利用反射来创建类的实例。

时间: 2024-10-02 23:21:45

简单工厂模式使用ResourceBundle读取.properties配置文件的相关文章

ResourceBundle读取properties配置文件

1 package cn.rocker.readProperties; 2 3 import java.util.ResourceBundle; 4 5 import org.junit.Test; 6 7 /** 8 * @ClassName: ResourceBundleRead 9 * @Description: ResourceBundle读取配置文件 10 * @author 112 11 * @date 2018年3月28日 下午12:35:27 12 */ 13 public cl

简单工厂模式(SimpleFactory)

最近在研究Java设计模式,因此把自己在学习过程中的体悟记录下来,以方便以后复习使用. 1.简单工厂的本质: 选择实现,根据语义我们知道简单工厂的重点是在选择上而不是实现上. 2.何时选用简单工厂: 1.如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,无须了解具体实现. 2.如果你想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个工厂可以创建很多的,不相关的对象. 3.优缺点 优点:更好的实现了面向接口编程,并且使

【设计模式学习笔记】 之 简单工厂模式

 简介:工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,拒绝客服端程序员通过new创建需要的实例,并且是通过使用一个共同的接口来指向新创建的对象,即接口引用指向实现类对象,是多态的灵活运用. 举例1[未使用工厂模式]: 一个家庭中有多辆汽车,这个家庭想去出游,需要先传一个Car到Family中持有,才能出游. 首先考虑多辆汽车,都有同样的ru

研磨设计模式解析及python代码实现——(一)简单工厂模式

最近在学设计模式,正巧书之前学了些python,但用的还不是很成熟.<研磨设计模式>书上只给了java代码,本着以练手为目标,我照着书上打了一遍java代码,在仔细体会其思想后,将其写成了python的代码.有不对的地方希望各位批评指正~ 具体原理不多做介绍,具体可以参考http://chjavach.iteye.com的博客,或者<研磨设计模式>的书. 一.背景介绍 接口思想: 众所周知,面向对象语言最大的特点便是封装,继承,多态这三个概念.而像Java等面向对象语言最核心的思想

简单工厂模式(静态工厂方法模式)【设计模式】

定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现.被创建实例可以是接口.抽象类,也可以是具体的类.它又称为静态工厂方法(Static Factory Method)模式 简单工厂模式的作用,优点:为客户端屏蔽所需要的实例的具体实现,客户端只需关注某个接口便可,无需关注实现.具体实现被封装起来:客户端和具体实现解耦,客户端只需关注接口,接口的实现变化对客户端没有影响.总结起来,就是封装功能,封转实例的具体实现:解耦功能,接口实现的变化影响不了客户端. 例子: 例子1:不带参数 没有

Design Patterns (简单工厂模式)

文章很长很精彩,如是初学请耐心观看.(大神请绕道!) 简单工厂模式: 1.创建型模式 2.简单工厂模式概述 3.简单工厂模式的结构与实现 4.简单工厂模式的应用实例 5.创建对象与使用对象 6.简单工厂模式的简化 7.简单工厂模式的优缺点与适用环境 1.创建型模式(Creational Pattern):       关注对象的创建过程 创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节 创建型模式描述如何将对象的创建和使用分离,让用

Java设计模式(一) 简单工厂模式不简单

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/design_pattern/simple_factory 简单工厂模式使用案例 有一种抽象产品--汽车(Car),同时有多种具体的子类产品,如BenzCar,BMWCar,LandRoverCar.类图如下 作为司机,如果要开其中一种车,比如BenzCar,最直接的做法是直接创建BenzCar的实例,并执行其drive方法,如下 package com.

简单工厂模式( Simple Factory Pattern )

1. 简单工厂模式( Simple Factory Pattern ) 1.1. 模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮.矩形按钮.菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式. 1.2

java读取.properties配置文件的几种方法

读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util.HashTable,即实现了Map接口,所以,可使用相应的方法来操作属性文件,但不建议使用像put.putAll这两个方法,因为put方法不仅允许存入String类型的value,还可以存入Object类型的.因此java.util.Properties类提供了getProperty()和setPr