一、什么是工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
【百度百科】工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
简单工厂模式
在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式又叫作静态工厂方法模式。
简单工厂模式的主要角色如下:
- 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
- 具体产品(ConcreteProduct):是简单工厂模式的创建目标。
其结构图如下图所示。
代码实现如下:
代码简介:主要实现一个文件上传功能,上传文件调用方可以通过工厂创建上传文件对象以实现自己定义将文件上传到哪里。
首先定义了一个接口类FileUpload,在接口类里面定义了上传方法。
创建不同上传方式类:比如七牛云、阿里云、腾讯云和百度云这些。然后实现FileUpload中的upload接口。
创建工厂类:能够实现FileUpload的创建,根据参数不同返回不同的FileUpload.最终实现自定义上传位置。
package com.xingli.springlearningdemo.pattern.factory;
/**
* description: SimpleFactory 简单工厂<br>
*
* @date: 2021/11/16 0016 下午 5:57 <br>
* @author: William <br>
* version: 1.0 <br>
*/
public class SimpleFactory {
public static void main(String[] args) {
FileUpload fileUpload = FileUploadFactory.initFileUpload(2);
fileUpload.upload();
}
//定义抽象上传接口类
public interface FileUpload{
void upload();
}
//七牛云上传接口类
static class QiNiuFileUpload implements FileUpload{
@Override
public void upload() {
System.out.println("七牛云文件上传");
}
}
//阿里云oss上传接口类
static class AliFileUpload implements FileUpload{
@Override
public void upload() {
System.out.println("阿里云文件上传");
}
}
//腾讯云文件上传接口
static class TencentFileUpload implements FileUpload{
@Override
public void upload() {
System.out.println("腾讯云文件上传");
}
}
//百度云文件上传接口
static class BaiDuFileUpload implements FileUpload{
@Override
public void upload() {
System.out.println("百度云文件上传");
}
}
//上传文件接口静态常量类
static final class FileUploadConst{
/**七牛云*/
static final int QI_NIU_FILE_UPLOAD = 1;
/**阿里云*/
static final int ALI_FILE_UPLOAD = 2;
/**腾讯云*/
static final int TENCENT_FILE_UPLOAD = 3;
/**百度云*/
static final int BAI_DU_FILE_UPLOAD = 4;
}
//上传文件工厂
static class FileUploadFactory{
/**
* description: initFileUpload 上传文件工厂,默认使用阿里云上传<br>
* version: 1.0 <br>
* @date: 2021/11/16 0016 下午 6:11 <br>
* @author: William <br>
* @param kindType 需要创建上传文件接口类型
* @return com.xingli.springlearningdemo.pattern.factory.SimpleFactory.FileUpload
*/
public static FileUpload initFileUpload(int kindType){
switch (kindType){
case FileUploadConst.QI_NIU_FILE_UPLOAD:
return new QiNiuFileUpload();
case FileUploadConst.TENCENT_FILE_UPLOAD:
return new TencentFileUpload();
case FileUploadConst.BAI_DU_FILE_UPLOAD:
return new BaiDuFileUpload();
default:
return new AliFileUpload();
}
}
/**
* description: initFileUpload 上传文件工厂,默认使用阿里云上传<br>
* version: 1.0 <br>
* @date: 2021/11/16 0016 下午 6:21 <br>
* @author: William <br>
* @return com.xingli.springlearningdemo.pattern.factory.SimpleFactory.FileUpload
*/
public static FileUpload initFileUpload(){
//使用默认文件上传方式
return initFileUpload(FileUploadConst.ALI_FILE_UPLOAD);
}
}
}