抽象工厂模式好不好(抽象工厂模式你值得拥有)
抽象工厂模式好不好(抽象工厂模式你值得拥有)我们先来创建一个课程工厂:课程类:而java手记,java视频他们处于同一产品族,都是java相关的;同一产品族,我们就看java,还是python还是fe;同一产品等级,我们就看它是视频还是手记即可;现在,我们提一个业务场景,现在提出了新的要求:每一个课程不仅仅要有视频,还要有对应的手记,如果用工厂方法的方式来进行扩展的话 ,这个时候,既要有java的手记类,Python的手记类,FE的手记类,还有手记的抽象类,手记的工厂,java的手记的工厂,python的手记的工厂,FE的手记的工厂,这个时候,就很容易出现类爆炸的现象;原来是一个视频是一个课程,现在一个视频加上一个手记是一个课程;java视频,python视频,fe视频他们属于同一产品等级,都是视频java手记,python手记,fe手记他们也属于同一产品等级,都是手记
更多java文章与项目资源、毕业设计
关注公众号 程序猿forever
抽象工厂模式- 6-1 抽象工厂讲解
- 6-2 抽象工厂coding
- 6-3 抽象工厂源码解析
工厂方法模式针对的就是产品等级结构
而抽象方法模式针对的就是产品族
我们只要在美的产品族里面取空调,取出来的肯定是美的的空调,我们在美的的产品族里面取冰箱,取出来的肯定也是美的的电冰箱,只要我们确定这个产品的产品族和产品等级结构,我们就可以唯一的确定这个产品:
从理论上来说:当一个工厂可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,那这个时候,抽象工厂模式要比工厂方法模式要更为简单,更有效率;
现在,我们提一个业务场景,现在提出了新的要求:每一个课程不仅仅要有视频,还要有对应的手记,如果用工厂方法的方式来进行扩展的话 ,这个时候,既要有java的手记类,Python的手记类,FE的手记类,还有手记的抽象类,手记的工厂,java的手记的工厂,python的手记的工厂,FE的手记的工厂,这个时候,就很容易出现类爆炸的现象;
原来是一个视频是一个课程,现在一个视频加上一个手记是一个课程;
java视频,python视频,fe视频他们属于同一产品等级,都是视频
java手记,python手记,fe手记他们也属于同一产品等级,都是手记
而java手记,java视频他们处于同一产品族,都是java相关的;
同一产品族,我们就看java,还是python还是fe;
同一产品等级,我们就看它是视频还是手记即可;
我们先来创建一个课程工厂:
课程类:
public abstract class Video {
public abstract void produce();
}
123
手记类:
public abstract class Article {
public abstract void produce();
}
123
课程工厂类:
public interface CourseFactory {
/** 获取视频 */
Video getVideo();
/** 获取手记 */
Article getArticle();
}
1234567
现在来创建java产品族的课程工厂:
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return null;
}
@Override
public Article getArticle() {
return null;
}
}
1234567891011
Java视频类:
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java视频");
}
}
123456
Java手记类:
public class JavaArticle extends Article {
@Override
public void produce() {
System.out.println("编写Java课程手记");
}
}
123456
现在,产品族里面的工厂类就可以这样来写了:
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
1234567891011
这里就是把视频工厂和手记工厂合在了一起;作为一个产品族;
我们再来写一个python的产品族的:
PythonArticle类:
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("编写Python课程手记");
}
}
123456
PythonVideo 类
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制Python的视频");
}
}
123456
现在,我们再来创建Python产品族的课程工厂(视频和手记合在了一起):
public class PythonCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Article getArticle() {
return new PythonArticle();
}
}
123456789101112
这个就是现在的类图:
测试:
只要是从Java产品族里面拿的肯定是Java的视频和Java的手记
public class Test {
public static void main(String[]args){
CourseFactory courseFactory = new JavaCourseFactory();
Article article = courseFactory.getArticle();
Video video = courseFactory.getVideo();
/** 只要是从Java产品族里面拿的肯定是Java的视频和Java的手记 */
article.produce();
video.produce();
}
}
12345678910
运行结果:
编写Java课程手记
录制Java视频
这样的话,就可以进行解藕;
在使用抽象工厂的时候,尽量找那种固定程度比较高的,像课程里面的视频和手记,视频和手记都是必须要有的,就可以用抽象工厂模式来解决;
缺点:在新增产品等级的时候,会比较的麻烦;
如果在现有的产品族里面添加新的产品等级,就违背了开闭原则了;
如果我们还要把源码放到课程的这个产品族里面,那么对原来的修改就比较大了;
6-3 抽象工厂源码解析
他们都是在同一个产品族里面;