简单工厂:
举例一个实际开发中用的场景,用户上传文件,但是文件涉及多种,比如flat文件、Excel、json、xml文件,上传的文件读取内容,下边就用工厂模式来设计
interface FileItemReader
List
}
class FlatFileItemReader
@Override
public List
return null;
}
}
class ExcelItemReader
@Override
public List
return null;
}
}
class JsonFileItemReader
@Override
public List
return null;
}
}
class FileItemReaderFactory
public FileItemReader
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
FileItemReader
List
}
}
工厂方法:
以读数据为例子,读数据可能从数据库里读、文件里读、还有一些非关系型数据库中读,就用工厂方法设计下边程序,就用上边的例子继续拓展了
interface ItemReader
List
}
interface FileItemReader
}
class FlatFileItemReader
@Override
public List
return null;
}
}
class ExcelItemReader
@Override
public List
return null;
}
}
class JsonFileItemReader
@Override
public List
return null;
}
}
interface JdbcItemReader
}
class JdbcCursorItemReader
@Override
public List
return null;
}
}
class HibernateItemReader
@Override
public List
return null;
}
}
interface Creator
ItemReader
}
class FileItemReaderFactory
@Override
public ItemReader
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
@Override
public ItemReader
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
List
}
抽象工厂
继续上边的设计,以读取flat类型文件为例,读取文件时候需要获取不同的流,也需要不同的数据映射关系,这里用抽象工厂就很合适
interface ItemReader
List
}
interface FileItemReader
}
class FlatFileItemReader
private final BufferReaderFactory bufferReaderFactory;
private final BeanMappingFactory beanMappingFactory;
public FlatFileItemReader(BufferReaderFactory bufferReaderFactory, BeanMappingFactory beanMappingFactory) {
this.bufferReaderFactory = bufferReaderFactory;
this.beanMappingFactory = beanMappingFactory;
}
@Override
public List
return null;
}
}
class ExcelItemReader
@Override
public List
return null;
}
}
class JsonFileItemReader
@Override
public List
return null;
}
}
interface JdbcItemReader
}
class JdbcCursorItemReader
@Override
public List
return null;
}
}
class HibernateItemReader
@Override
public List
return null;
}
}
interface Creator
ItemReader
}
class FileItemReaderFactory
private final BufferReaderFactory bufferReaderFactory;
private final BeanMappingFactory beanMappingFactory;
public FileItemReaderFactory(BufferReaderFactory bufferReaderFactory, BeanMappingFactory beanMappingFactory) {
this.bufferReaderFactory = bufferReaderFactory;
this.beanMappingFactory = beanMappingFactory;
}
@Override
public ItemReader
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
@Override
public ItemReader
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
List
}