工厂模式(Factory Pattern)是一种创建型设计模式,它将对象的创建和使用分离,通过工厂类来负责创建对象。这种模式可以降低代码间的耦合度,提高可维护性和可扩展性。
一、核心思想
二、工厂模式的三种形态
1. 简单工厂(Simple Factory)
2. 工厂方法(Factory Method)
3. 抽象工厂(Abstract Factory)
下边以简单工厂模式、工厂方法、抽象工厂、实例开发中怎么用举例。(这里仅仅是一个设计思路,实际开发中还需要根据功能和业务修改)
简单工厂:
举例一个实际开发中用的场景,用户上传文件,但是文件涉及多种,比如flat文件、Excel、json、xml文件,上传的文件读取内容,下边就用工厂模式来设计
interface FileItemReader{
List read();
}
class FlatFileItemReader implements FileItemReader{
@Override
public List read() {
return null;
}
}
class ExcelItemReader implements FileItemReader{
@Override
public List read() {
return null;
}
}
class JsonFileItemReader implements FileItemReader{
@Override
public List read() {
return null;
}
}
class FileItemReaderFactory{
public FileItemReader createFileItemReader(String fileName){
if(fileName.endsWith("csv") || fileName.endsWith("txt")){
return new FlatFileItemReader();
}else if(fileName.endsWith("xlsx") || fileName.endsWith("xls")){
return new ExcelItemReader();
}else if(fileName.endsWith("json")){
return new JsonFileItemReader();
}else {
throw new IllegalArgumentException("不支持的文件类型");
}
}
}
public class FactoryDemo {
public static void main(String[] args) {
String fileName = "test.xlsx";
FileItemReaderFactory factory = new FileItemReaderFactory();
FileItemReader fileItemReader = factory.createFileItemReader(fileName);
List read = fileItemReader.read();
}
}
工厂方法:
以读数据为例子,读数据可能从数据库里读、文件里读、还有一些非关系型数据库中读,就用工厂方法设计下边程序,就用上边的例子继续拓展了
interface ItemReader {
List read();
}
interface FileItemReader extends ItemReader {
}
class FlatFileItemReader implements FileItemReader {
@Override
public List read() {
return null;
}
}
class ExcelItemReader implements FileItemReader {
@Override
public List read() {
return null;
}
}
class JsonFileItemReader implements FileItemReader {
@Override
public List read() {
return null;
}
}
interface JdbcItemReader extends ItemReader {
}
class JdbcCursorItemReader implements JdbcItemReader {
@Override
public List read() {
return null;
}
}
class HibernateItemReader implements JdbcItemReader {
@Override
public List read() {
return null;
}
}
interface Creator {
ItemReader create(String type);
}
class FileItemReaderFactory implements Creator {
@Override
public ItemReader create(String fileName) {
if (fileName.endsWith("csv") || fileName.endsWith("txt")) {
return new FlatFileItemReader();
} else if (fileName.endsWith("xlsx") || fileName.endsWith("xls")) {
return new ExcelItemReader();
} else if (fileName.endsWith("json")) {
return new JsonFileItemReader();
} else {
throw new IllegalArgumentException("不支持的文件类型");
}
}
}
class JdbcItemReaderFactory implements Creator {
@Override
public ItemReader create(String type) {
if(type.equals("jdbc")){
return new JdbcCursorItemReader();
}else if (type.equals("hibernate")){
return new HibernateItemReader();
}else {
throw new IllegalArgumentException("不支持的文件类型");
}
}
}
public static void main(String[] args) {
String fileName = "test.xlsx";
Creator creator = new FileItemReaderFactory();
List read = creator.create(fileName).read();
}
抽象工厂
继续上边的设计,以读取flat类型文件为例,读取文件时候需要获取不同的流,也需要不同的数据映射关系,这里用抽象工厂就很合适
interface ItemReader {
List read();
}
interface FileItemReader extends ItemReader {
}
class FlatFileItemReader implements FileItemReader {
private final BufferReaderFactory bufferReaderFactory;
private final BeanMappingFactory beanMappingFactory;
public FlatFileItemReader(BufferReaderFactory bufferReaderFactory, BeanMappingFactory beanMappingFactory) {
this.bufferReaderFactory = bufferReaderFactory;
this.beanMappingFactory = beanMappingFactory;
}
@Override
public List read() {
return null;
}
}
class ExcelItemReader implements FileItemReader {
@Override
public List read() {
return null;
}
}
class JsonFileItemReader implements FileItemReader {
@Override
public List read() {
return null;
}
}
interface JdbcItemReader extends ItemReader {
}
class JdbcCursorItemReader implements JdbcItemReader {
@Override
public List read() {
return null;
}
}
class HibernateItemReader implements JdbcItemReader {
@Override
public List read() {
return null;
}
}
interface Creator {
ItemReader create(String type);
}
class FileItemReaderFactory implements Creator {
private final BufferReaderFactory bufferReaderFactory;
private final BeanMappingFactory beanMappingFactory;
public FileItemReaderFactory(BufferReaderFactory bufferReaderFactory, BeanMappingFactory beanMappingFactory) {
this.bufferReaderFactory = bufferReaderFactory;
this.beanMappingFactory = beanMappingFactory;
}
@Override
public ItemReader create(String fileName) {
if (fileName.endsWith("csv") || fileName.endsWith("txt")) {
return new FlatFileItemReader(bufferReaderFactory, beanMappingFactory);
} else if (fileName.endsWith("xlsx") || fileName.endsWith("xls")) {
return new ExcelItemReader();
} else if (fileName.endsWith("json")) {
return new JsonFileItemReader();
} else {
throw new IllegalArgumentException("不支持的数据库读取类型");
}
}
}
class JdbcItemReaderFactory implements Creator {
@Override
public ItemReader create(String type) {
if(type.equals("jdbc")){
return new JdbcCursorItemReader();
}else if (type.equals("hibernate")){
return new HibernateItemReader();
}else {
throw new IllegalArgumentException("不支持的数据库读取类型");
}
}
}
interface BufferReaderFactory {
BufferedReader create(Resource resource, String encoding);
}
interface BeanMappingFactory {
BeanPropertyMap create(Class> clazz, String lineData);
}
public static void main(String[] args) {
String fileName = "test.xlsx";
Creator creator = new FileItemReaderFactory();
List read = creator.create(fileName).read();
}
通过上边的举例,工厂模式其实就是将较为复杂的类创建,统一的bean的生命周期,不同类型的类统一封装起来,为了代码的解偶。
参与评论
手机查看
返回顶部