1. 简单工厂

简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例。
属于创建型模式,但它不属于GOF,23种设计模式。

案例1:假设要开展一个直播课,包含大数据,java,人工智能等等,这样一个过程用简单工厂来实现!
ICourse课程接口

  1. public interface ICourse {
  2. //课程录制
  3. public void record();
  4. }

公共接口

JavaCourse java工程类

  1. public class JavaCourse implements ICourse {
  2. @Override
  3. public void record() {
  4. System.out.println("录制java课程");
  5. }
  6. }

实现了课程接口,重写了方法

CourseFactory 课程工厂

  1. public class CourseFactory {
  2. /*public ICourse create(String name){
  3. if ("java".equals(name)){
  4. return new JavaCourse();
  5. }else{
  6. return null;
  7. }
  8. }*/
  9. /*public ICourse create(String className){
  10. try {
  11. if (!(null == className || "".equals(className))){
  12. return (ICourse)Class.forName(className).newInstance();
  13. }
  14. }catch (Exception e){
  15. e.printStackTrace();
  16. }
  17. return null;
  18. }*/
  19. public ICourse create(Class clazz){
  20. try {
  21. if (clazz != null){
  22. return (ICourse)clazz.newInstance();
  23. }
  24. }catch (Exception e){
  25. e.printStackTrace();
  26. }
  27. return null;
  28. }
  29. }

课程工厂负责对象的创建,用于后续调用对象方法

SimpleFactoryTest 测试类

  1. public class SimpleFactoryTest {
  2. public static void main(String[] args) {
  3. /*CourseFactory factory = new CourseFactory();
  4. ICourse course = factory.create("com.tiansu.shejimoshi.factory.SimpleFactory.JavaCourse");
  5. course.record();*/
  6. CourseFactory factory = new CourseFactory();
  7. ICourse course = factory.create(JavaCourse.class);
  8. course.record();
  9. }
  10. }

如果我们需要创建大数据课程录播,我们只需要再写一个大数据课程类,实现课程接口就可以了!
简单工厂在很多场景都有应用,比如我们的日志方法,调用时间的api等等。
工厂类负责创建的对象比较少,客户端只需要传入工厂的参数,对于如何创建对象的逻辑不需要关心。
简单工厂缺点:工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则,不易于扩展过于复杂的产品结构。

2. 工厂方法模式

工厂方法模式(Factory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行,属于创建型设计模式。

ICourseFactory 课程工厂

  1. public interface ICourseFactory {
  2. ICourse create();
  3. }

JavaCourseFactory java课程工厂

  1. public class JavaCourseFactory implements ICourseFactory{
  2. @Override
  3. public ICourse create() {
  4. return new JavaCourse();
  5. }
  6. }

PythonCourseFactory python工厂

  1. public class PythonCourseFactory implements ICourseFactory{
  2. @Override
  3. public ICourse create() {
  4. return new PythonCourse() ;
  5. }
  6. }

FactoryMethodTest 测试类

  1. public class FactoryMethodTest {
  2. public static void main(String[] args) {
  3. ICourseFactory factory = new PythonCourseFactory();
  4. ICourse iCourse = factory.create();
  5. iCourse.record();
  6. }
  7. }

工厂模式方法优点对于新的课程,只需要创建对应的工厂类即可,如果需要改动执行内容则新创建一个工厂方法!

3. 抽象工厂模式(工厂方法模式升级)

抽象工厂模式(Abstract Factory Pattern)是指提供一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类,属于创建型设计模式。

image.png
面对更多的业务背景和各式各样的课程产品选择!!!

ICourseFactory 工厂方法

  1. //要求所有子工厂都实现这个工厂
  2. //(一个品牌的抽象)
  3. //不符合开闭原则
  4. public interface ICourseFactory {
  5. ICourse createCourse();
  6. INote createNote();
  7. IVideo createVideo();
  8. }

JavaCourseFactory java课程工厂

  1. public class JavaCourseFactory implements ICourseFactory {
  2. @Override
  3. public ICourse createCourse() {
  4. return new JavaCourse();
  5. }
  6. @Override
  7. public INote createNote() {
  8. return new JavaNote();
  9. }
  10. @Override
  11. public IVideo createVideo() {
  12. return new JavaVideo();
  13. }
  14. }

PythonCourseFactory python课程工厂

  1. public class PythonFactory implements ICourseFactory{
  2. @Override
  3. public ICourse createCourse() {
  4. return null;
  5. }
  6. @Override
  7. public INote createNote() {
  8. return null;
  9. }
  10. @Override
  11. public IVideo createVideo() {
  12. return null;
  13. }
  14. }

AbstractFactoryTest 测试类

  1. public class AbstractFactoryTest {
  2. public static void main(String[] args) {
  3. ICourseFactory factory = new JavaCourseFactory();
  4. factory.createCourse().record();
  5. factory.createNote();
  6. factory.createVideo();
  7. }
  8. }

抽象工厂适应场景:
客户端不依赖于产品类实例规则如何被创建、实现等细节。
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。
提供一个产品类库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

抽象工厂优点:
具体产品在应用层代码隔离,无需关心创建细节。
将一个系列的产品族统一到一起创建。

抽象工厂缺点:
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象产品工厂的接口。
增加了系统的抽象性和理解难度。