简单工厂模式不属于23种设计模式,是指一个工厂决定创建哪一种产品类的实例,简单工厂适用于需要创建的对象较少的情形,客户端只需要传工厂类的参数,不需要关心工厂创建对象的逻辑。下面我们以课程为例。
有一个ICource接口
public interface ICource {
/**
* 录制视频
*/
void record();
}
接下来有JavaCource课程实现了ICource接口
public class JavaCource implements ICource {
public void record() {
System.out.println("录制Java课程");
}
}
客户端代码
public class Test {
public static void main(String[] args) {
ICource cource = new JavaCource();
cource.record();
}
}
很显然,父类ICource接口指向了子类JavaCource引用,此时客户端依赖了JavaCource,随着业务的不断扩大,需要增加一门Python课程甚至更多,则此时客户端的依赖就会变得非常臃肿。那么有没有一种方法来降低这种依赖呢?答案是肯定的,那就是简单工厂模式,客户端只需要依赖工厂,不需要只要具体创建对象的细节。
CourceFactory
public class CourceFactory {
static ICource create(String name){
if(name.equals("Java")){
return new JavaCource();
}else if(name.equals("Python")){
return new PythonCoure();
}
return null;
}
}
客户端代码
public class Test {
public static void main(String[] args) {
ICource cource = CourceFactory.create("Java");
cource.record();
}
}
由上述客户端代码可知,客户端调用代码变得简单了很多,若需要扩展业务需求,每增加一类课程,则都需要修改CourceFactory中的create方法,不符合开闭原则,此时我们可以利用反射优化简单工厂的代码,如下:
public class CourceFactory {
static ICource create(Class <? extends ICource> clazz){
if(clazz != null){
try {
return clazz.newInstance();
} catch (Exception e) {
e.getCause();
return null;
}
}
return null;
}
}
客户端代码:
public class CourceFactory {
static ICource create(Class <? extends ICource> clazz){
if(clazz != null){
try {
return clazz.newInstance();
} catch (Exception e) {
e.getCause();
return null;
}
}
return null;
}
}
简单工厂模式也有一定的缺点,譬如:工厂类的任务过于繁重,不利于扩展,不符合单一职责原则