设计模式通过特有的模式,帮我们简化我们的代码。工厂模式也不列外。
将从简单工厂模式,到工厂模式,到抽象工厂模式的一个记录。
1.简单的工厂模式:
简单工厂模式实现了生成产品类的代码跟客户端代码分离,在工厂类中你可以添加所需的生成产品的逻辑代码;
课程类的共同接口
public interface ICourse {
/**
* 录制视频
* @return
*/
void record();
}
课程A
public class JavaCourse implements ICourse {
public void record() {
System.out.println("录制Java课程");
}
}
课程B
public class PythonCourse implements ICourse {
public void record() {
System.out.println("录制Python课程");
}
}
工厂类
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();
问题来了,优秀的java代码是符合“开放-封闭”原则的,也就是说对扩展开发,对修改关闭,如果你要加一个产品类C,你就要修改工厂类里面的生成产品的代码,在这里你就要增加if-else判断。对于这个问题,我们的工厂方法模式就可以解决这个问题。
2.工厂模式
工厂方法模式中我们把生成产品类的时间延迟,就是通过对应的工厂类来生成对应的产品类,在这里我们就可以实现“开发-封闭”原则,无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。也即,通过子类的子类进行实现具体的方法。
课程工厂模型
public interface ICourseFactory {
ICourse create();
}
课程类
public interface ICourse {
/**
* 录制视频
* @return
*/
void record();
}
课程A 的工厂
public class JavaCourseFactory implements ICourseFactory {
public ICourse create() {
return new JavaCourse();
}
}
课程A的实现
public class JavaCourse implements ICourse {
public void record() {
System.out.println("录制Java课程");
}
}
课程B的工厂
public class PythonCourseFactory implements ICourseFactory {
public ICourse create() {
return new PythonCourse();
}
}
课程B的实现
public class PythonCourse implements ICourse {
public void record() {
System.out.println("录制Python课程");
}
}
测试类:
ICourseFactory factory = new PythonCourseFactory();
ICourse course = factory.create();
course.record();
factory = new JavaCourseFactory();
course = factory.create();
course.record();
但是这还是有缺点的,如果产品类过多,我们就要生成很多的工厂类。对于这种情况我们可以采用抽象工厂模式。
3.抽象工厂模式
定义一个用户的主入口,便于扩展
课程工厂
public interface CourseFactory {
INote createNote();
IVideo createVideo();
}
笔记接口
public interface INote {
void edit();
}
视频接口
public interface IVideo {
void record();
}
课程A的工厂
public class JavaCourseFactory implements CourseFactory {
public INote createNote() {
return new JavaNote();
}
public IVideo createVideo() {
return new JavaVideo();
}
}
课程A的做笔记的具体实现
public class JavaNote implements INote {
public void edit() {
System.out.println("编写Java笔记");
}
}
课程A的视频的具体实现
public class JavaVideo implements IVideo {
public void record() {
System.out.println("录制Java视频");
}
}
同理,其他课程的工厂,以及对应工厂的具体的实现如上。
测试类:
JavaCourseFactory factory = new JavaCourseFactory();
factory.createNote().edit();
factory.createVideo().record();
抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。我们在使用中要注意使用抽象工厂模式的条件。
代码地址为:https://github.com/virtuousOne/Design-patterns