1.简单工厂模式
1.1 正常的业务逻辑
客户端通过new创建对象,通过对象调用业务中的方法
1.2 简单的工厂模式
客户端通过new Factory 拿到业务对象,调用其方法
代码演示:
接口
public interface Course {
/*录制视频*/
public void record();
}
模拟业务A
public class JavaCourse implements Course {
@Override
public void record() {
System.out.println("录制java视频!");
}
}
模拟业务B
public class PythonCourse implements Course{
@Override
public void record() {
System.out.println("录制Python视频!");
}
}
工厂模式
public class FactoryModel {
public Course createCourse(String name){
if ("java".equals(name)){
return new JavaCourse();
}else if ("python".equals(name)){
return new PythonCourse();
}
return null;
}
}
客户端调用业务
public class CourseController {
public static void main(String[] args) {
new FactoryModel().createCourse("java");
}
}
可以将工厂内的方法改成静态方法static,这样就可以直接调用FactoryModel().createCourse(“java”);不需要再通过new FactoryModel()
注:static修饰的方法不能调用非static
上面工厂引发的问题:当需要拓展C语言录制视频,此时我们不仅需要增加业务C,而且要修改工厂类,不符合开闭原则
通过反射技术优化工厂:
public class FactoryReflect {
public Course createCourse(String className) throws Exception {
if (!(null==className||"".equals(className))){
return (Course)Class.forName(className).newInstance();
}
return null;
}
}
客户端调用(提供类路径即可)
public class CourseController {
public static void main(String[] args) throws Exception{
new FactoryReflect().createCourse("com.gree.mybatis_pagehelp.moudels.Model.JavaCourse");
}
}
上述优化好像挺讲究,不过还能更讲究,上述参数用了字符串,可以在优化一下
public Course createCourse1(Class<? extends Course> clazz) throws Exception{
if (null!=clazz){
return clazz.newInstance();
}
return null;
}
客户端调用,通过xxxx.class作为入参
public class CourseController {
public static void main(String[] args) throws Exception{
// new FactoryModel().createCourse("java");
//new FactoryReflect().createCourse("com.gree.mybatis_pagehelp.moudels.Model.JavaCourse");
new FactoryReflect().createCourse1(JavaCourse.class);
}
}
1.3总结
工厂模式,感觉就是,将创建对象交给工厂完成,无需在代码中通过new的方式创建我们需要的对象
适应场景:
1. 创建对象需要大量重复代码
2. 客户端不依赖产品类实例如何创建,实现等细节
3. 一个类通过其子类来指定创建哪个对象
缺点:
4. 类的个数容易过多,增加复杂度
5. 增加系统的抽象性和理解难度