1. 简单工厂模式简介
简单工厂模式的主要核心是:根据不同的情况(比如你输入的参数)给你返回不同的对象。
举例:最简单的例子是电饭锅。根据你不同的按钮返回一个不同的对象(这个对象有最高温度的属性)。你如果要烧水,它返回的那个对象的温度是100°。你如果要保温,这个温度可能就只有35°等等。
2. 简单工厂模式代码分析
我们先来看一下任务(就是保温或烧水)的对象的父类。
//任务对象的父类
public class Task {
//功能名称
public String taskName;
//温度
public Integer temperature;
//最大温度阀值
public void maxThreshould(){
System.out.println("最大温度为:"+temperature);
}
}
接下来我们看一下保温对象的代码
//保温,继承Task类
public class KeepWarm extends Task{
public String taskName = "保温";
public Integer temperature = 35;
}
接下来我们看一下烧水对象的代码
//烧水,继承Task类
public class BoilingWater extends Task {
public String taskName = "烧水";
public Integer temperature = 100;
}
接下来我们来看重点,简单对象工厂的代码
//简单对象工厂的代码
public class OperationFactory {
public static Task getTask(String taskName){
if("保温".equals(taskName)){
return new KeepWarm();
}
if("烧水".equals(taskName)){
return new BoilingWater();
}
return null;
}
}
这样我们只要输入相对应的功能名称,就能得到不同的对象。
3. 探讨设计原理
看到这里,估计有些人会对这个例子不满意。那我就稍微模拟一下对话。以下是戏精时间:
大佬:这个例子是不是有点问题?不能将烧水和保温的功能一块放在一个对象中吗?
回: 例子是没有问题的。烧水和保温的功能也是可以放在一起的。
大佬: 那为什么不将烧水和保温的功能放在一块呢?
回: 这个涉及到耦合问题了。如果你要保温功能去掉呢?如果你要新增一个煮饭功能呢?是不是得改代码
大佬: 那你新增一个煮饭功能就不需要改代码了?
回: 也是需要改的。但是我这边就直接在工厂类中进行修改就好了。但是你将所有的功能都放在一个类中,就显得代码比较臃肿,不方便维护。放在工厂类中就减少了他们之间的耦合。
大佬: 既然都要改,有啥区别?
回: 这个涉及到安全问题,如果按照你那种将所有功能全都放在一起的方法,那你必须将所有的代码给你。比如你要修改保温功能,那你是不是可以任意改烧水的功能逻辑呢?但是如果按照简单对象工厂来设计的话,你只能改你自己保温的功能。
大佬: 这样是不是有点麻烦了?
回: 是的,虽然分类多了,但是你代码也更清晰了。安全性也得到保证了。最简便的方法就是我们将所有的方法都写在一个类中,但是这样我们后期维护的成本就会很高。就像注释一般,没了注释,你的代码肯定更少了,但是没有注释的话,后期如果要改功能就太耗费时间去看代码了。