该项目源码地址:https://github.com/ggb2312/Code/tree/master/java-basic/design-pattern
(设计模式相关代码与笔记)
1. 定义
抽象工厂模式提供同一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类
2. 适用场景
- 客户端(应用层)不依赖于具体产品类实例如何被创建、实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
- 提供一个产品类的库,所有的产品以同样的接口出现从而使客户端不依赖于具体实现
3. 类图与角色
抽象工厂类图- AbstractFactory:抽象工厂接口,里面包含所有的产品创建的抽象方法
- ConcreteFactory:具体的工厂,创建具有特定实现的产品对象
- AbstractProduct:抽象产品,有可能由两种不同的实现
- ConcreteProduct:对于抽象产品的具体分类的实现
4. 产品等级结构与产品族
产品等级结构与产品族理解抽象工厂和工厂方法需要理解产品等级结构与产品族的区别和关系。
关于产品等级结构与产品族,可以打一个比方
美的生产空调、洗衣机、冰箱;海尔也生产空调、洗衣机、冰箱。
美的空调、美的洗衣机、美的冰箱就是一个产品族
美的空调、海尔空调就是一个产品等级结构
抽象工厂与工厂方法区别:
工厂方法:针对的是产品等级结构
抽象工厂:针对的是产品族
5. 代码实例
背景:现在慕课网需要制作Java、Python等课程,需要视频+手记组合才算一套课程
(1)创建抽象工厂类,定义具体工厂的公共接口
类图对应的角色 AbstractFactory
public interface CourseFactory {
Video getVideo();
Article getArticle();
}
(2)创建抽象产品族类,定义具体产品的公共接口
类图对应的角色 AbstractProduct
public abstract class Video {
public abstract void produce();
}
public abstract class Article {
public abstract void produce();
}
(3)创建具体产品类(继承抽象产品类), 定义生产的具体产品
类图对应的角色 ConcreteProduct
录制java、python视频
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课程视频 ");
}
}
编写java、python手记
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课程手记");
}
}
(4)创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
类图对应的角色 ConcreteFactory
JavaCourseFactory工厂录制java视频、编写java手记
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
PythonCourseFactory工厂录制python视频、编写python手记
public class PythonCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Article getArticle() {
return new PythonArticle();
}
}
(5)测试
项目结构慕课网制作java、python课程
public class Test {
public static void main(String[] args){
CourseFactory courseFactory = new JavaCourseFactory();
Video video = courseFactory.getVideo();
Article article = courseFactory.getArticle();
article.produce();
video.produce();
}
}
测试结果
(6)类图
查看此时的类图帮助理解。
应用层制作java课程时,根本无需关注java视频与java手记的创建等细节,只需要和JavaCourseFactory工厂类打交道即可。
5. 优点
- 具体产品在应用层代码隔离,无须关系创建细节
- 将一个系列的产品族统一到一起创建
- 新的产品族扩展性好,符合了“开闭原则”
6. 缺点
- 规定了所有可能被创建的产品等级集合,产品族中扩展新的产品等级困难,需要修改抽象工厂的接口,违背了“开闭原则”。
- 增加了系统的抽象性和理解难度
7. 扩展-JDK1.7源码中的抽象工厂
java.sql.Connection
java.sql.Statement
sqlsessionfactory
网友评论