设计模式之工厂模式

一、介绍

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

优点:

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

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

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

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

缺点:

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

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

相关推荐
杨充19 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充20 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充20 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充20 小时前
2.面向对象的特性
设计模式
杨充20 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充20 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充20 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式