工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
一、简单工厂模式
-
定义
简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例。
2.使用场景
-
厂类负责创建的对象较少
-
客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心
3.优点
-
只需传入一个正确的参数,就可以获取你所需要的对象,无需知道其创建的细节
4.缺点
-
工厂类的职责相对国中,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则
-
不易于扩展过于复杂的产品结构
5.实例
-
定义一个课程标准的接口
public interface ICourse { /** 录制视频 */ public void record(); }
b.创建一个java课程的实现JavaCourse类
public class JavaCourse implements ICourse {
public void record() {
System.out.println("录制 Java 课程");
}
}
c.调用
public static void main(String[] args) {
ICourse course = new JavaCourse();
course.record();
}
父类 ICourse 指向子类 JavaCourse 的引用,应用层代码需要依赖 JavaCourse,如果业务扩展,我继续增加 PythonCourse 甚至更多,那么我们客户端的 依赖会变得越来越臃肿。因此,我们要想办法把这种依赖减弱,把创建细节隐藏。虽然 目前的代码中,我们创建对象的过程并不复杂,但从代码设计角度来讲不易于扩展。现 在,我们用简单工厂模式对代码进行优化
d.增加课程PythonCourse
public class PythonCourse implements ICourse { public void record() { System.out.println("录制 Python 课程"); } }
e.创建CourseFactory工厂类
public class CourseFactory {
public ICourse create(String name){
if("java".equals(name)){
return new JavaCourse();
}else if("python".equals(name)){
return new PythonCourse();
}else {
return null;
}
}
}
f.修改调用方法
public class SimpleFactoryTest { public static void main(String[] args) { CourseFactory factory = new CourseFactory(); factory.create("java"); } }
上述方法中客户端调用简单了,但是如果我们业务继续扩展,要增加课程,那么工厂中的create方法每次都要修改代码逻辑,不符合开闭原则,因此我们可以继续优化,采用反射技术:
public ICourse create(String className){
try {
if (!(null == className || "".equals(className))) {
return (ICourse) Class.forName(className).newInstance();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
优化客户端代码:
ICourseFactory factory = new ICourseFactory();
ICourse course = factory.create("com.elvis.pattern.factory.JavaCourse");
course.record();
优化之后发现参数是一串字符串,可控性有待提升,还需要强制转型,再此优化
public ICourse create(Class<? extends ICourse> clazz){
try {
if (null != clazz) {
return clazz.newInstance();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
优化客户端代码:
CourseFactory factory = new CourseFactory();
ICourse course = factory.create(JavaCourse.class);
course.record();
这样的话,一个简单工厂模式就完成了。