这里需要想象一下二维坐标,x轴是产品类型,y轴是各个工厂,那么工厂实现同一个工厂接口,可想而知,要生产出对应工厂对应的产品,就需要指定工厂,再调用工厂中生产产品的方法,就可以准确得到产品。
"产品"接口
public interface INote {
/**
* 做笔记
*/
void edit();
}
public interface IVideo {
/**
* 录制视频
*/
void record();
}
"产品"实现
public class JavaNote implements INote {
@Override
public void edit() {
System.out.println("编辑Java笔记");
}
}
public class JavaVideo implements IVideo {
@Override
public void record() {
System.out.println("录制java视频");
}
}
public class PythonNote implements INote {
@Override
public void edit() {
System.out.println("编辑Python笔记");
}
}
public class PythonVideo implements IVideo {
@Override
public void record() {
System.out.println("录制Python视频");
}
}
"工厂"接口
public interface CourseFactory {
INote createNote();
IVideo createVideo();
}
"工厂"实现
public class JavaCourseFactory implements CourseFactory {
@Override
public INote createNote() {
return new JavaNote();
}
@Override
public IVideo createVideo() {
return new JavaVideo();
}
}
public class PythonCourseFactory implements CourseFactory {
@Override
public INote createNote() {
return new PythonNote();
}
@Override
public IVideo createVideo() {
return new PythonVideo();
}
}
具体使用
@Test
public void test1(){
JavaCourseFactory javaCourseFactory = new JavaCourseFactory();
javaCourseFactory.createNote().edit();
javaCourseFactory.createVideo().record();
}
类关系图

image.png
小结
这里可以发现,对y轴(工厂)进行扩展是十分简单的事情,但是对x轴就不是很友好,如果需要新增一种产品,就需要对各个工厂进行维护,不符合开闭原则;但是实际开发中,不需要纠结太多,有时候问题不大,毕竟有的代码很久都不会被升级。