一、工厂方法模式
定义:
工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
适用场景:
-
创建对象需要大量重复的代码
-
客户端(应用层)不依赖于产品实例如何被创建、实现等细节
-
一个类通过子类来指定创建哪个对象
优点
-
用户只需关心所需产品对应的工行,无需关心创建细节
-
加入新产品符合开闭原则,提高系统的可扩展性
缺点
-
类的个数容易过多,增加了代码结构的复杂度
-
增加了系统的抽象性和理解难度
实例
定义工厂模型
public interface ICourseFactory {
ICourse create();
}
定义java课程工厂模型
public class JavaCourseFactory implements ICourseFactory {
public ICourse create() {
return new JavaCourse();
}
}
定义一个python课程的工厂模型
public class PythonCourseFactory implements ICourseFactory {
public ICourse create() {
return new PythonCourse();
}
}
客户端调用
ICourseFactory factory = new PythonCourseFactory();
ICourse course = factory.create();
course.record();
factory = new JavaCourseFactory();
course = factory.create();
course.record();
二、抽象工厂模式
定义
抽象工厂模式(Abastract Factory Pattern)是指提供一个人创建一系列相关或相互依赖对象的接口,无需指定他们具体的类
适用场景
-
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
-
强调一系列相关的产品对象(属于同一产品族)一起使用创建对 象需要大量重复的代码
-
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
优点
-
具体产品再应用层代码隔离,无需关心创建细节
-
将一个系列的产品族统一到一起创建
缺点
-
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难, 需要修改抽象工厂的接口。
-
增加了系统的抽象性和理解难度。
实例
创建抽象工厂
public interface CourseFactory {
INote createNote();
IVideo createVideo();
}
创建记笔记的接口类
public interface INote {
void edit();
}
录视频类
public interface IVideo {
void record();
}
创建java产品族,JavaVideo类
public class JavaVideo implements IVideo {
public void record() {
System.out.println("录制Java视频");
}
}
创建笔记JavaNote类
public class JavaNote implements INote {
public void edit() {
System.out.println("编写Java笔记");
}
}
创建java产品族的具体工厂JavaCoursefactory
public class JavaCourseFactory implements CourseFactory {
public INote createNote() {
return new JavaNote();
}
public IVideo createVideo() {
return new JavaVideo();
}
}
同样的可以创建Python产品族的方法,直接上代码
public class PythonNote implements INote {
public void edit() {
System.out.println("编写Python笔记");
}
}
public class PythonVideo implements IVideo {
public void record() {
System.out.println("录制Python视频");
}
}
public class PythonCourseFactory implements CourseFactory {
public INote createNote() {
return new PythonNote();
}
public IVideo createVideo() {
return new PythonVideo();
}
}
客户端调用
JavaCourseFactory factory = new JavaCourseFactory();
factory.createNote().edit();
factory.createVideo().record();
PythonCourseFactory factory1 = new PythonCourseFactory();
factory1.createNote().edit();
factory1.createVideo().record();