设计模式——工厂模式

设计模式——工厂模式

本文个人博客地址:https://abeille.top/blog/detail/AT815YDW7

工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式;

  1. 简单工厂模式:有一个工厂对象决定创建哪一种产品类的实例(不属于GoF的23种设计模式)。其缺点是工厂类的职责过重,不易于扩展过于复杂的场景;

简单工厂模式使用示例:

首先定义一个课程标准接口;

public interface ICourse {
     
 /** 录制视频 */
 void record ();
}

定义接口的实现:

public class JavaCourse implements ICourse {
     
 @Override
 public void record () {
     
  System.out.println(“java 课程”);
 }
}
public class PythonCourse implements ICourse {
     
 @Override
 public void record () {
     
  System.out.println(“python 课程”);
 }
}

创建工厂类:

public class CourseFactory {
     
 public ICourse create (Class<? Extends ICourse> clazz) {
     
  try {
     
   if (null != clazz) {
     
    return clazz.newInstance(); // 通过反射获取类的实例
   }
  } catch () {
     
   e.printStackTree();
  }
 }
}

调用示例:

public class SimpleFactoryExample {
     
 public static void main (String[] args) {
     
  CourseFactory factory = new CourseFacotry();
  ICourse course = factory.create(JavaCourse.class);
  course.record();
 }
}

这里涉及到一个概念——::开闭原则:::软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification);

  1. 工厂方法模式:定义一个创建对象的接口,但是让实现这个接口的类来决定实例化那个类,工厂方法模式让类的实例化推迟到子类中进行;工厂方法模式主要解决扩展问题;

工厂方法模式使用示例(对简单工厂模式的代码进行修改):

创建工厂接口:

public interface ICourseFactory {
     
 /** 录制视频 */
 ICourse create ();
}

创建子工厂类:

public class JavaCourseFactory implements ICourseFactory {
     
 @Override
 public ICourse create () {
     
  return new JavaCourse();
 }
}
public class PythonCourseFactory implements ICourseFactory {
     
 @Override
 public ICourse create () {
     
  return new PythonCourse();
 }
}

调用示例:

public class FactoryMethodExample {
     
 public static void main (String[] args) {
     
  ICourseFactory factory = new JavaCourseFacotry();
  ICourse course = factory.create();
  course.record();
 }
}

工厂方法模式适用的场景:

  • 创建对象需要大量重复的代码;
  • 客户端不依赖产品类实例如何被创建、如何被实现的细节;
  • 一个类通过子类来指定创建哪个对象;
    工厂方法模式的缺点:
  • 类的个数会比较多,增加复杂度;
  • 增加了系统抽象性和理解难度;
  1. 抽象工厂模式:创建一个一系列相关或相互依赖对象的接口,无须指定其具体类;客户端不依赖于产品实例如何被创建、如何被实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。

抽象工厂模式使用示例(以工厂方法模式代码进行修改):

增加视频录制、文档编写接口;

public interface IVideo {
     
 void record ();
}
public interface INote {
     
 void edit ();
}

创建实现类:

public class JavaVideo implements IVideo {
     
 @Override
 public void record () {
     
  System.out.println(“Java视频课”);
 }
}
public class PythonVideo implements IVideo {
     
 @Override
 public void record () {
     
  System.out.println(“Python视频课”);
 }
}
public class JavaNote implements INote {
     
 @Override
 public void edit () {
     
  System.out.println(“Java笔记”);
 }
}
public class PythonNote implements INote {
     
 @Override
 public void edit () {
     
  System.out.println(“Python笔记”);
 }
}

创建抽象工厂类:

public interface ICourseFactory {
     
 IVideo createVideo ();
 INote createNote ();
}

创建java产品族的具体工厂:

public class JavaCourseFactory implements ICourseFactory {
     
 @Override
 public IVideo createVideo () {
     
  return new JavaVideo ();
 }

 @Override
 public INote createNote () {
     
  return new JavaNote ();
 }
} 

创建Python产品族的具体工厂:

public class PythonCourseFactory implements ICourseFactory {
     
 @Override
 public IVideo createVideo () {
     
     return new PythonVideo ();
 }

 @Override
 public INote createNote () {
     
      return new PythonNote ();
 }
} 

调用示例:

public class AbsFactoryExample {
     
 ICourseFactory factory = new JavaCourseFactory();
 factory.createVideo().record();
 factory.createNote().edit();
}

抽象工厂模式的缺点:

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口及具体实现;
  • 增加了系统的抽象性和理解难度;

你可能感兴趣的:(设计模式,设计模式,java)