源代码
GitHub源代码
1.本文目标
本文目标是为了让大家认识并理解抽象工厂设计模式。
2.基本套路
定义:提供了一个创建一系列相关或相互依赖对象的接口
类型:创建型
选择关键点:产品族是否需要一起提供,且是否有一致的接口
设计原则:遵循单一职责、依赖倒置、开闭原则
使用概率:30%
难度系数:中
3.适用场景
1.客户端(应用层)不依赖于产品实例如何被创建,实现等细节
2.强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
3.提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
4.使用步骤
1.创建抽象工厂接口,定义具体工厂的公共接口
2.创建抽象产品族类,定义抽象产品的公共接口
3.创建具体产品类(继承抽象产品类)& 定义生产的具体产品
4.创建具体工厂类(实现抽象工厂接口),定义创建对应具体产品实例的方法
5.客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
5.举个栗子
我们用具体的代码去更好的理解这个设计模式
5.1栗子说明
- 背景:想分享,然后通过生产Java视频和Python视频的方式进行传播
- 目的:希望使用工厂方法模式实现这2个产品的生产
5.2使用步骤
实现代码如下:
步骤1.创建抽象工厂接口,定义具体工厂的公共接口
public interface BaseCourseFactory {
BaseVideo getVideo();
BaseNote getNote();
}
步骤2.创建抽象产品族类,定义具体产品的公共接口
public abstract class BaseNote {
public abstract void produce();
}
public abstract class BaseVideo {
public abstract void produce();
}
步骤3.创建具体产品类(继承抽象产品类) 定义生产的具体产品
public class JavaNote extends BaseNote {
@Override
public void produce() {
System.out.println("编写Java课程笔记");
}
}
public class JavaVideo extends BaseVideo {
@Override
public void produce() {
System.out.println("生产Java课程视频");
}
}
public class PythonNote extends BaseNote {
@Override
public void produce() {
System.out.println("编写Python课程笔记");
}
}
public class PythonVideo extends BaseVideo {
@Override
public void produce() {
System.out.println("生产Python课程视频");
}
}
步骤4. 创建具体工厂类(实现抽象工厂接口),定义创建对应具体产品实例的方法
public class JavaCourseFactory implements BaseCourseFactory {
@Override
public BaseVideo getVideo() {
return new JavaVideo();
}
@Override
public BaseNote getNote() {
return new JavaNote();
}
}
public class PythonCourseFactory implements BaseCourseFactory {
@Override
public BaseVideo getVideo() {
return new PythonVideo();
}
@Override
public BaseNote getNote() {
return new PythonNote();
}
}
步骤5. 客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
public static void main(String[] args) {
//通过JavaCourseFactory去创建javaVideo和JavaNote
BaseCourseFactory courseFactory = new JavaCourseFactory();//创建Java课程工厂
courseFactory.getVideo().produce();//通过工厂类得到JavaVideo对象并进行创建
courseFactory.getNote().produce();//通过工厂类得到JavaNote对象并进行创建
//通过PythonCourseFactory去创建pythonVideo和PythonNote
PythonCourseFactory pythonCourseFactory = new PythonCourseFactory();//创建Python课程工厂
pythonCourseFactory.getVideo().produce();//通过工厂类得到PythonVideo对象并进行创建
pythonCourseFactory.getNote().produce();//通过工厂类得到PythonNote对象并进行创建
}
6.优点
- 具体产品在应用层代码隔离,无需关心创建细节
- 将一个系列的产品族统一到一起创建
7.缺点
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
- 增加了系统的抽象性和理解难度
8.总结
本文只是对抽象工厂模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。
网友评论