设计模式之工厂模式

一、介绍

工厂模式(Factory Pattern)是最常使用的设计模式之一,属于创建型设计模式 。在该设计模式中,我们不再使用new实例化对象,而是通过工厂对象 来获取指定的对象实例,其中对象的实例化过程是在工厂中完成的。换句话说,就是将对象的实例化过程从 调用方控制 改变成 工厂控制

大家回忆一下spring框架的IOC容器:spring的IOC容器主要使用的设计模式之一就是工厂模式,它将我们对对象的控制权转移给了BeanFactory,BeanFactory把实例化的对象放在单例池(即容器)中,当我们需要从spring中获取一个对象时,spring直接从该容器中获取对应的实例并返回给我们。

工厂模式分为 简单工厂 静态工厂 工厂方法 抽象工厂。

我们先来一个简单静态工厂的案例,因为比较简单直接看代码。

java 复制代码
public class CarFactory {
    // 简单静态工厂

    public static Car getCar(String carName) {
        if ("保时捷".equals(carName)) {
            return new Porsche();
        } else if ("兰博基尼".equals(carName)) {
            return new Lamborghini() ;
        }else {
            return null ;
        }
    }
}

测试类

java 复制代码
public class Test {
    public static void main(String[] args) {
        Car porsche = CarFactory.getCar("保时捷");
        porsche.getName();
    }
}

根据不同汽车名称创建不同的汽车

上面的类CarFactory 里面给出了保时捷和兰博基尼2个汽车品牌,如果要生成第三种品牌的汽车就要修改CarFactory 里面的代码 实际上是违背设计原则的开闭原则的。

所以引入了工厂方法模式

今天主要介绍工厂方法模式

二、基本组件

  • 工厂抽象。接口或抽象类,定义了工厂的行为。
  • 工厂实现类。对工厂的行为提供了具体实现。不同的工厂实现类用于创建不同的产品实现类。
  • 产品抽象。作为父类或接口,规定了一类具有相同行为的产品。
  • 产品实现类。产品抽象类的具体实现。

一般来讲,从工厂中获取的对象类型为抽象类型,其具体类型由工厂方法决定。

三、案例应用

我们将上面CarFactory 进行再次抽象,然后又2个汽车工厂兰博基尼工厂(LamborghiniFactory)和保时捷工厂(PorscheFactory) 分别生产保时捷(Porsche)和兰博基尼(Lamborghini)

1. 代码演示

下面我们通过代码模拟工厂模式的实现

  • 汽车工厂
java 复制代码
public interface CarFactory {
    Car getCar();
}
  • 兰博基尼工厂
java 复制代码
public class LamborghiniFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Lamborghini();
    }
}
  • 保时捷工厂
java 复制代码
public class PorscheFactory implements CarFactory {

    @Override
    public Car getCar() {
        return new Porsche();
    }
}
  • 车子类
java 复制代码
public interface Car {
    void getName();
}
  • 保时捷
java 复制代码
public class Porsche implements Car {
    @Override
    public void getName() {
        System.out.println("保时捷汽车");
    }
}
  • 兰博基尼
java 复制代码
public class Lamborghini implements Car {
    @Override
    public void getName() {
        System.out.println("兰博基尼汽车");
    }
}

演示:

2. 优缺点

优点:

对象的创建过程与使用过程被解耦。如果被创建的对象结构复杂,则可以在工厂方法中完成该对象结构的组装。

工厂方法返回的是产品抽象。因此我们无需关注产品细节,只需要按照产品抽象所定义的方法进行方法调用即可。

当产品的创建过程需要修改时,我们只需在工厂方法中对创建逻辑进行修改即可,无需修改调用方的代码。

适用于结构复杂的对象的创建场景。

缺点:

虽然我们不再关注对象的创建过程,但是代价是需要关注工厂实例的创建过程。其实无论从代码层面还是现实层面来说,工厂对象一般只有一个,我们需要结合单例模式来处理对象工厂的创建和获取逻辑。
一个工厂对象仅能创建一种产品。
每当新增一个产品时,同样也需要创建对应的工厂类。这会导致项目中积累大量的工厂类和产品类。

不适用于简单对象的创建。原本只需一行代码就能完成,而使用工厂模式就需要创建工厂类、工厂方法等,增加代码量

相关推荐
苏渡苇5 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日6 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.6 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon7 小时前
七大设计原则介绍
设计模式
YigAin9 小时前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业1 天前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑1 天前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲1 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头1 天前
设计模式与C语言高级特性的结合
c语言·设计模式
小温冲冲1 天前
通俗且全面精讲单例设计模式
开发语言·javascript·设计模式