设计模式之工厂模式

一、介绍

工厂模式(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. 优缺点

优点:

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

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

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

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

缺点:

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

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

相关推荐
sxlishaobin11 小时前
设计模式之原型模式
设计模式·原型模式
范纹杉想快点毕业12 小时前
嵌入式通信核心架构:从状态机、环形队列到多协议融合
linux·运维·c语言·算法·设计模式
__万波__12 小时前
二十三种设计模式(二十)--解释器模式
java·设计模式·解释器模式
攀登的牵牛花12 小时前
前端向架构突围系列 - 架构方法(一):概述 4+1 视图模型
前端·设计模式·架构
雲墨款哥12 小时前
从一行好奇的代码说起:React的 useEffect 到底是不是生命周期?
前端·react.js·设计模式
cultivator12948015 小时前
设计原则和设计模式助记
设计模式
enjoy编程15 小时前
Spring boot 4 探究netty的关键知识点
spring boot·设计模式·reactor·netty·多线程
用户938169125536015 小时前
Head First 单例模式
后端·设计模式
a35354138216 小时前
设计模式-桥接模式
c++·设计模式·桥接模式
sxlishaobin16 小时前
设计模式之外观模式
java·设计模式·外观模式