一、定义
创建型
提供一个创建一系列的相关或相互依赖对象的接口
二、代码
其实逻辑类似于工厂方法,只是将工厂创建对象扩展到多个类,即同一产品族的产品。
参考之前工厂方法的业务场景,现在要求视频+手记才算是课程,那我们如何创建课程。
//Video接口
public abstract class Video {
public abstract void produce();
}
//两个实现
public class JavaVideo extends Video{
@Override
public void produce() {
System.out.println("录制java课程视频");
}
}
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制python课程视频");
}
}
//Article接口
public abstract class Article {
public abstract void produce();
}
//两个实现
public class JavaArticle extends Article {
@Override
public void produce() {
System.out.println("写java手记");
}
}
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("写python手记");
}
}
//CourseFactory工厂接口
public interface CourseFactory {
//创建同一产品族的产品对象
Video getVideo();
Article getArticle();
}
//JavaCourseFactory
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
//PythonCourseFactory
public class PythonCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Article getArticle() {
return new PythonArticle();
}
}
//客户端(应用层)
public class Test {
public static void main(String[] args) {
CourseFactory courseFactory = new JavaCourseFactory();
Video video = courseFactory.getVideo();
Article article = courseFactory.getArticle();
video.produce();
article.produce();
CourseFactory courseFactory1 = new PythonCourseFactory();
Video video1 = courseFactory1.getVideo();
Article article1 = courseFactory1.getArticle();
video1.produce();
article1.produce();
}
}
运行结果
录制java课程视频
写java手记
录制python课程视频
写python手记
三、适用场景
1、客户端(应用层)不依赖于产品类如何被实现和创建的细节
2、强调一系列相关的产品对象(属于同一产品族)一起适用,创建对象需要大量重复代码
3、提供一个产品类的工厂,所有产品以同样的接口出现,从而使客户端不依赖于具体的实现
优点:
1、用户只需要关心所需产品族对应的工厂,无需关心创建细节。
2、将一个系列的产品族统一到一起创建,清晰明了,不容易出错。
缺点:
1、规定了所有可能被创建的产品集合,当产品族需要扩展新的产品时,需要修改抽象工厂的接口。
2、增加系统的抽象性和理解难度
经过对比工厂方法和抽象工厂
抽象工厂里,经常以工厂方法的方式出现,
只是工厂方法关注产品等级结构,而抽象工厂更注重于产品族的创建
个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。