简单工厂并不算23种基本设计模式,只是对程序功能的简单封装、解耦
参考如下代码:
public interface Employee {
public void doJob();
}
public class Tester implements Employee {
public void doJob() {
System.out.println("test");
}
}
public class Developer implements Employee {
public void doJob() {
System.out.println("code");
}
}
public class Job {
public void assignJob(String jobType){
Employee e = null;
if(jobType.equals("test"))
e = new Tester();
else if(jobType.equals("code"))
e = new Developer();
if(e != null)
e.doJob();
}
}
整个分配工作分为两步,首先找到一位员工,然后让这名员工工作
很现实的情况是如果公司增加一些岗位,比如增加一种新的员工类型:产品,即便整个分配工作的流程并没有变更,但是依然要对assignJob方法进行修改,因为assignJob方法中涉及到了寻找员工的具体细节(耦合度过高),那么我们可以改进一下
public class Job {
public void assignJob(String jobType){
Employee e = findEmployee(jobType);
if(e != null)
e.doJob();
}
private Employee findEmployee(String jobType){
Employee e = null;
if(jobType.equals("test"))
e = new Tester();
else if(jobType.equals("code"))
e = new Developer();
return e;
}
}
无论增加多少种岗位,我们都不需要修改assignJob方法了(避免不必要的改动影响原有的业务流程),仅需要修改findEmployee方法
此时我们再考虑一下,工作不能主动去找员工,因此寻找员工显然不是工作类的固有职责(单一职责),因此findEmployee方法没必要放在Job类下,因此我们可以把findEmployee方法拿出来单独进行封装
public class EmployeeFactory {
public static Employee findEmployee(String jobType){
Employee e = null;
if(jobType.equals("test"))
e = new Tester();
else if(jobType.equals("code"))
e = new Developer();
return e;
}
}
public class Job {
public void assignJob(String jobType){
Employee e = EmployeeFactory.findEmployee(jobType);
if(e != null)
e.doJob();
}
}
修改后的类之间关系图如下
Job类已经与具体的Employee类型解耦,但是并不是说这个耦合不存在了,只是从Job类转移至了EmployeeFactory类中,但是至少通过这个简单的封装,使得类的功能职责更加简单明,避免了需求变更(增加新的员工类型)对原有逻辑(分配工作)的影响
因此简单工厂的主要作用是使调用方与具体类之间解耦