定义
抽象工厂模式,提供一个创建一系列相关,或相互依赖对象的接口。无需指定他们具体的类
类型
创建型
特点
- 客户端不依赖于产品类实例如何被创建、实现等细节。
- 强调一系列相关的产品对象,一起使用创建对象需要大量的重复代码。
- 提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现
优点
- 具体产品在应用层代码隔离,无需关心创建细节。
- 将一个系列的产品族统一到一起的创建
缺点
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
- 增加了系统的抽象性和系统结构
产品族:海尔洗衣机、海尔冰箱、海尔空调
产品等级结构:海尔洗衣机、TCL洗衣机、格力洗衣机
Coding
public interface CourseFactory {
Video getVideo();
Article getArticle();
}
public abstract class Video {
public abstract void produce();
}
public abstract class Article {
public abstract void produce();
}
public class JavaCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java");
}
}
public class JavaArticle extends Article{
@Override
public void produce() {
System.out.println("Java 手记");
}
}
public class PythonCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Article getArticle() {
return new PythonArticle();
}
}
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("python 视频");
}
}
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("Python 手记");
}
}
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();
}
}
工厂方法关注产品等级结构,抽象工厂关注产品族
抽象工厂中,从具体产品族工厂取出来的,肯定属于同一产品族。可扩展性好,如新增前端产品族时,只要添加前端产品工厂和具体产品即可,符合开闭原则。
但新增产品等级比较麻烦,如果为现有产品族添加新的产品等级时,就不符合开闭原则。比如现在对每个课程除了视频、手记,还需要添加源码,则此时需要修改课程工厂,及它的各个具体实现
因此,对于产品等级结构相对固定的,且需要多个产品组合到一起形成产品族的业务场景时。推荐使用抽象工厂。