23种设计模式之工厂方法模式

其实工厂模式有三种,因为简单工厂模式(Simple Factory)不属于23种设计模式之一,故将其放在一起阐述。

简单工厂模式(Simple Factory Principle)

  定义:由一个工厂对象决定创建出哪一种产品的实例,将对象的创建过程交给工厂去管理,用的时候通过工厂去生成获得 ,也是最简单的生产者-消费者模型的体系。

  代码:

    //产品接口

      public interface ICourse{

          void  study();

     }

    //产品1

    public class JavaCourse implement ICourse {

          void  study(){

        System.out.println("正在学习Java 课程!");

      }

     }

    //产品2

    public class PythonCourse implement ICourse {

          void  study(){

        System.out.println("正在学习Python 课程!");

      }

     }

    //产品工厂(通过传入实际需要创建的产品类生产实际的产品)

    public class CourseFactory{

      ICourse getCourse(Class clazz) throws Exception{

        if(null != clazz){

          return (ICourse)clazz.newInstance();

        }

      }

    }

   优点: 将有可能对象复杂的创建过程封装起来,提高了代码的可读性和可维护性,减少了代码的冗余度。

   缺点:工厂类的职责相对过重,增加新产品时需要修改工厂类的创建逻辑,违背了开闭原则,不易于扩展更复杂的业务场景,兼容性和稳定性较差。

      

工厂方法模式 (Factory Method Principle)

 定义:定义一个创建产品对象的接口,但让实现这个接口的类来决定实例化哪个类,让产品实例化推迟到子类中进行。

代码:假设还是上面的课程产品为例,但是需要定义课程工厂接口。

  //产品工厂接口

  public interface ICourseFactory{

    ICourse getCourse();

  }

      // Java产品工厂

  public class JavaCourseFactory implements ICourseFactory {

    ICourse getCourse(){

      retrun new JavaCourse();

    }

  }

  //python产品工厂

  public class PythonCourseFactory implements ICourseFactory {

    ICourse getCourse(){

      retrun new PythonCourse();

    }

  }

 每一个具体的工厂去创建具体的产品,如果有新课程产品,我们只需要新增新的课程产品工厂就可以完成业务扩展。

 优点:工厂方法模式时简单工厂的升级

    1.有所有简单工厂的优点

    2.每一工厂只负责创建一种产品,符合单一职责原则。

    3.业务扩展不需要修改原代码,符合开闭原则。

 缺点:创建对象需要较多冗余的代码,项目体积变大,类对象增加浪费资源,系统维护成本高。

 

以下是随手写的一个对于跨境支付场景的一个应用,因为实际生产环境中工厂类都是单例的,所以不具备太多实际的应用价值,只是作为一个参考,实际开发中对于支付会有更多复杂的场景,比如支付工厂,通道工厂,创建支付上下文,支付流程模板,支付前后验证回调,支付网关,风险预警规则,等等后续一系列的的大型复杂场景,不是没有实际需求的情况下能考虑的全面的。

代码地址:http://120.77.238.200:5566/tuanzi/gpwork/tree/master/pattern/src/main/java/org/stu/pattern/pay

类图:
v1:版本
image.png

image.png

v2:image.png
image.png

 

 

 

posted @ 2020-02-24 15:07  洛十一  Views(137)  Comments(0)    收藏  举报