文章目录
工厂模式
是创建对象的最佳方式, 属于创建型方式,在工厂模式中,我们在创建对象的时候不是向客户端暴露创建逻辑,
并且是通过一个共同的接口指向创建的对象.
示例:
这里我们使用课程来做示例,课程里面包含课程视频(Icourse),课程笔记(INode)…,拥有不同课程(java,python…)实现这个接口.
- ICourse & INode :
public interface INote {
public void create();
}
public interface INote {
public void create();
}
- 不同的课程实现这些接口
public class JavaCourse implements ICourse ,INote{
public void record() {
System.out.println("录制java课程");
}
public void create() {
System.out.println("创建Java笔记");
}
}
一.简单工厂模式(Simple Factory pattern)
是指由一个工厂对象决定创建出哪一种产品类的实例.
示例 :
简单工厂 : 最开始可以传入要创建的课程名
工厂代码 :
public class CourseFactory {
public ICourse create(String name){
if("java".equals(name)){
return new JavaCourse();
}else if("python".equals(name)){
return new PythonCourse();
}else {
return null;
}
}
}
调用代码 :
public static void main(String[] args) {
CourseFactory courseFactory = new CourseFactory();
ICourse course = courseFactory.create("Java");
course.record();
}
上面的工厂代码中,对比普通的new出一个JavaCourse,屏蔽了创建的细节,只需要传入一个 "Java"就行了,但是这样的简单工厂有一个问题,就是随着业务的扩展,比如新来个python课程,就需要对工厂中的代码进行修改,不符合开闭原则.
如何优化?
我们可以利用反射
技术进行优化
类图 :
public class CourseFactory {
public ICourse create(Class clazz) {
try {
if (null != clazz) {
return (ICourse) clazz.newInstance();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
CourseFactory courseFactory = new CourseFactory();
ICourse course = courseFactory.create(JavaCourse.class);
course.record();
}
这样就能很好的避免频繁修改代码了.
二. 工厂方法模式(Factory Method Pattern)
是指定义一个创建对象的接口,但是让实现这个接口的类决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行.
类图:
工厂接口 :
interface IcoursepFactory {
ICourse course() ;
}
不同工厂实现这个接口 :
public class JavaCourseFactory implements IcoursepFactory {
public ICourse course() {
return new JavaCourse();
}
}
测试代码 : 通过创建不同的工厂来创建不同的对象
public static void main(String[] args) {
IcoursepFactory factory = new JavaCourseFactory();
ICourse course = factory.course();
course.record();
}
工厂模式目前看起来就是一个工厂只能生产出一种产品,你需要那种产品只需要创建出专门生产该产品的工厂就行了
三.抽象工厂方法(Abstract Factory Method)
是指创建一系列相关或者相互依赖的对象的接口,无需指定它们具体的类.简单来说,就是一个工厂可以产出多个产品,这些产品的集合也是被抽象出来的,这些同系列产品也能被其他的工厂创建.
示例: 课程包含: 录屏,笔记… ,而且拥有不同的课程都能拥有这些东西.
课程内容的集合 :
//要求所有的子工厂都实现这个接口中的所有方法
public interface ICourseFactory {
ICourse createCourse();
INote createINote();
IVideo createVidio();
}
java课程的子工厂:
public class JavaCourseFactory implements ICourseFactory {
public ICourse createCourse() {
return new JavaCourse();
}
public INote createINote() {
return new JavaINote();
}
public IVideo createVidio() {
return new JavaVideo();
}
}
java课程内容具体实现 :
public class JavaINote implements INote {
public void create() {
System.out.println("java笔记");
}
}
public class JavaVideo implements IVideo {
public void create() {
System.out.println("Java 视频");
}
}
这种工厂方法,规定了所有 可能被创建的方法的集合,产品中扩展新的产品困难,需要修该抽象工厂的接口.