1,设计原则
工厂和工厂对象尽量都是高内聚的, 例如网上最多的例子, 支付案例, 一个支付工厂, 可以创建微信支付对象, 也可以创建支付宝支付对象, 他们都是属于支付
这样方便别人理解, 和代码重构, 改一处代码, 修复所有使用此功能的地方
2,优势
降低耦合, 肯定降低了呀, 你通过工厂方法获取一个工厂对象, 调用一些方法, 方法里面写的都是公用代码,需要替换逻辑的时候, 直接改变参数就可以切换到一个工厂对象了,
封装代码, 你写的代码变漂亮了, 恭喜你离面向对象又跟近了一步
3,上传文件场景
我就不写支付了, 网上的支付看的太多了,
工厂类
/**
* 演示简单工厂
*/
public class UploadFactory {
public static final String OSS = "OSS";
public static final String LOCAL = "LOCAL";
/**
* 获取
* @param type 需要采用什么方式上传对象
* @return
*/
public static UploadBean getUpload(String type) {
System.out.println("文件上传日志~");
if (OSS.equals(type)) {
return new OssUpload();
}
if (LOCAL.equals(type)) {
return new LocalStoreUpload();
}
System.out.println("错误不存在的上传方式");
return null;
}
public static void main(String[] args) {
UploadBean upload = UploadFactory.getUpload(LOCAL);
// 这里只是演示, 我就不创建文件了
upload.upload(null);
}
}
工厂抽象对象
import java.io.File;
/**
* 抽象工厂对象
*/
public interface UploadBean {
/**
* @param file 上传的文件
* @return 是否成功
*/
boolean upload(File file);
}
工厂实例对象1
/**
* 上传文件对象实例一
* 保存到本地对象
*/
public class LocalStoreUpload implements UploadBean{
@Override
public boolean upload(File file) {
System.out.printf("保存本地成功");
return true;
}
}
工厂实例对象2
/**
* 上传文件对象实例二
* 上传到远程服务器
*/
public class OssUpload implements UploadBean{
@Override
public boolean upload(File file) {
System.out.println("上传到远程服务器成功!");
return true;
}
}
4, 最后
1, 可以看到的是, 通过切换不同的参数就可以实现业务逻辑切换, 参数确实可以提供一个Class 对象,以后新建另一种上传方式直接传class 对象就好了,
2, 很多人肯定会问, 我为什么不直接把对象new 出来呢? 当然可以直接new出来调用, 但是有了封装就可以做很多事情了, 就比如你看 工厂里面的 getUpload, 打印了‘ 文件上传日志 ’, 在这个里面是可以做很多事情的, 你要是分开,是不是每个对象里面都得写日志, 这个得看你怎么使用了, 怎么理解, = _ =,