由一个工厂对象决定创建出哪一种产品类的实例(严格意义并不是设计模式,更是一种风格)
新建视频,通过【视频工厂】创建不同类型的视频
Video
public abstract class Video {public abstract void produce();
}
JavaVideo
public class JavaVideo extends Video {@Overridepublic void produce() {System.out.println("Java课程视频");}
}
PythonVideo
public class PythonVideo extends Video {@Overridepublic void produce() {System.out.println("Python课程视频");}
}
VideoFactory
public class VideoFactory {// 类创建public Video getVideo(Class c) {Video video = null;try {video = (Video) Class.forName(c.getName()).newInstance();} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {e.printStackTrace();}return video;}// 字符串创建public Video getVideo(String type) {if ("java".equalsIgnoreCase(type)) {return new JavaVideo();} else if ("python".equalsIgnoreCase(type)) {return new PythonVideo();}return null;}
}
JDK中的Calender类
类图查看:
JDBC中的DriverManger
简单来说,作为工厂生产的方法
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类;工厂方法让类的实例化推迟到子类中进行(创建型)
适用场景
优点:
缺点
制作不同视频的场景
产品:
public abstract class Video {public abstract void produce();
}
具体产品:
public class JavaVideo extends Video {@Overridepublic void produce() {System.out.println("制作Java课程视频");}
}public class PythonVideo extends Video {@Overridepublic void produce() {System.out.println("制作Python课程视频");}
}public class FEVideo extends Video {@Overridepublic void produce() {System.out.println("制作FE课程视频");}
}
创建者
public abstract class VideoFactory {public abstract Video getVideo();
}
具体创建者
public class JavaVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {return new JavaVideo();}
}public class PythonVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {return new PythonVideo();}
}public class FEVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {return new FEVideo();}
}
四个角色:
Collection中Iterator方法
以ArrayList为例子,他们之间的关系为:
URLStreamHandlerFactory 中的 createURLStreamHandler
工厂模型:URLStreamHandlerFactory
具体工厂:Factory
产品模型: URLStreamHandler
具体产品:实际实现的各种Handler
定义与类型
定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口
无须指定它们具体的类
类型:创建型
适用场景
优点
具体产品在应用层代码隔离,无须关心创建细节
将一个系列的产品族统一到一起创建
缺点
与工厂方法的侧重点:
// 课程的抽象工厂
public interface CourseFactory {// 课程视频Video getVideo();// 课程笔记Article getArticle();
}
具体工厂
public class JavaCourseFactory implements CourseFactory {@Overridepublic Video getVideo() {return new JavaVideo();}@Overridepublic Article getArticle() {return new JavaArticle();}
}public class PythonCourseFactory implements CourseFactory {@Overridepublic Video getVideo() {return new PythonVideo();}@Overridepublic Article getArticle() {return new PythonArticle();}
}
工厂的产品:
public abstract class Article {public abstract void produce();
}public abstract class Video {public abstract void produce();
}
具体产品:
public class JavaArticle extends Article {@Overridepublic void produce() {System.out.println("编写Java课程手记");}
}
public class PythonArticle extends Article {@Overridepublic void produce() {System.out.println("编写Python课程手记");}
}
public class PythonVideo extends Video {@Overridepublic void produce() {System.out.println("录制Python课程视频");}
}
public class JavaVideo extends Video {@Overridepublic void produce() {System.out.println("录制Java课程视频");}
}
同一颜色为一个产品族,如代码例子中的 Java课程产品族 和 Python 产品族
java.sql.Connection
java.sql.Statement
Mybatis中的sqlSessionFactory