设计模式-工厂模式

设计模式-工厂模式

简单工厂:

举例一个实际开发中用的场景,用户上传文件,但是文件涉及多种,比如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();

}