• 设计模式-创建型模式-工厂方法模式


    一、什么是工厂方法模式

            工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

    二、场景模拟

            假设我们要给一个成本计算系统设计一套各种材料的成本计算。其中材料有钢板、油漆、运输等成本,每个成本需要计算单条记录成本,本周成本和月度成本。

    三、业务实现

            首先我们定义一下成本接口 ICosts,里面有三个方法,分别是SingleCosts(),WeekCosts()和

    MonthCosts()。

    3.1、定义成本接口

    成本接口 ICosts,模拟三个方法,计算单个成本、本月成本和本周成本;

    1. public interface ICosts {
    2. /**
    3. * 单成本计算
    4. */
    5. void SingleCosts();
    6. /**
    7. * 周成本计算
    8. */
    9. void WeekCosts();
    10. /**
    11. * 月成本计算
    12. */
    13. void MonthCosts();
    14. }

    3.2、定义具体实现类 

    首先是钢板类材料实现类

    1. public class GBCosts implements ICosts {
    2. @Override
    3. public void SingleCosts() {
    4. System.out.println("计算钢板成本");
    5. }
    6. @Override
    7. public void WeekCosts() {
    8. System.out.println("计算本周钢板成本");
    9. }
    10. @Override
    11. public void MonthCosts() {
    12. System.out.println("计算本月钢板成本");
    13. }
    14. }

    然后是油漆

    1. public class YQCosts implements ICosts {
    2. @Override
    3. public void SingleCosts() {
    4. System.out.println("计算油漆成本");
    5. }
    6. @Override
    7. public void WeekCosts() {
    8. System.out.println("计算本周油漆成本");
    9. }
    10. @Override
    11. public void MonthCosts() {
    12. System.out.println("计算本月油漆成本");
    13. }
    14. }

    最后是运输

    1. public class YSCosts implements ICosts {
    2. @Override
    3. public void SingleCosts() {
    4. System.out.println("计算运输成本");
    5. }
    6. @Override
    7. public void WeekCosts() {
    8. System.out.println("计算本周运输成本");
    9. }
    10. @Override
    11. public void MonthCosts() {
    12. System.out.println("计算本月运输成本");
    13. }
    14. }

    3.3、定义成本计算工厂

    1. public class CostsFactory {
    2. public ICosts getCostsService(String name) {
    3. switch (name) {
    4. case "GB":
    5. return new GBCosts();
    6. case "YQ":
    7. return new YQCosts();
    8. case "YS":
    9. return new YSCosts();
    10. default:
    11. throw new RuntimeException("不错在此成本计算服务");
    12. }
    13. }
    14. }

    3.4、测试

    1. public static void main(String[] args) {
    2. CostsFactory costsFactory = new CostsFactory();
    3. ICosts GBCosts = costsFactory.getCostsService("GB");
    4. GBCosts.SingleCosts();
    5. GBCosts.WeekCosts();
    6. GBCosts.MonthCosts();
    7. ICosts YQCosts = costsFactory.getCostsService("YQ");
    8. YQCosts.SingleCosts();
    9. YQCosts.WeekCosts();
    10. YQCosts.MonthCosts();
    11. }

    可以看到既满足了业务的需求,也满足了自己对代码的追求。这样的代码不必有大量的if-else存在,而且扩展性更强,代码结构更加清晰。

    四、总结

            工厂方法模式(Factory Method Pattern)是一种创建型设计模式,用于创建对象的过程被推迟到子类中进行,这样可以使一个类的实例化延迟到其子类。这种模式通过定义一个创建对象的接口,但是由子类决定要实例化的类是哪一个。

            当使用时只需要调用抽象工厂接口来创建即可,不需要了解具体的实现和创建逻辑。例如在数据库操作中,针对不同的数据库类型(Mysql、Oracle等)可以使用不同的数据库连接对象,工厂方法可以根据需要创建不同类型的连接对象。

            通过工厂方法,我们可以在客户端代码中对产品的具体类型进行抽象,并通过子类来创建相应的对象,从而提供了更大的灵活性和可扩展性。

  • 相关阅读:
    【目标检测】Fast R-CNN论文详细解读
    javaweb之ajax异步交互
    MySQL的SELECT查询基础
    C++之互斥锁、读写锁、互斥量、 信号量、原子锁机制总结(二百二十五)
    c++异网正确使用接受
    中国人保为天能电力器具承保产品责任险,为消费者保驾护航!
    WordPress怎么禁止用户使用HTML标签,自动过滤HTML代码?
    多线程ThreadLocal详细介绍
    软件授权文件.lic文件
    数据库索引失效
  • 原文地址:https://blog.csdn.net/Hao_ge_666/article/details/134518184