设计模式之工厂模式

一、介绍

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

优点:

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

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

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

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

缺点:

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

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

相关推荐
忧郁的Mr.Li13 小时前
设计模式--工厂模式
设计模式
HL_风神15 小时前
C++设计模式浅尝辄止
c++·设计模式
会员果汁16 小时前
22.设计模式-享元模式(Flyweight)
设计模式·哈希算法·享元模式
亓才孓17 小时前
[设计模式]单例模式的懒汉式写法
单例模式·设计模式
小码过河.19 小时前
设计模式——访问者模式
设计模式·访问者模式
Engineer邓祥浩20 小时前
设计模式学习(21) 23-19 备忘录模式
学习·设计模式·备忘录模式
亓才孓21 小时前
[设计模式]单例模式饿汉式写法
单例模式·设计模式
代码丰21 小时前
设计模式:不再手动 set DTO,采用 Builder 模式
设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(二十一)—— 探索和发现设计模式
人工智能·设计模式
茶本无香2 天前
设计模式之八: 适配器模式解释及应用
java·设计模式·适配器模式