GoF之工厂模式

GoF(Gang of Four)设计模式中的工厂模式(Factory Pattern)属于创建型模式,它旨在处理对象的创建,目的是将对象的创建过程与其使用过程分离,以提高代码的灵活性和可维护性。

  • GoF23种设计模式可分为三大类:

    • 创建型(5个):解决对象创建问题。

      • 单例模式

      • 工厂方法模式

      • 抽象工厂模式

      • 建造者模式

      • 原型模式

    • 结构型(7个):一些类或对象组合在一起的经典结构。

      • 代理模式

      • 装饰模式

      • 适配器模式

      • 组合模式

      • 享元模式

      • 外观模式

      • 桥接模式

    • 行为型(11个):解决类或对象之间的交互问题。

      • 策略模式

      • 模板方法模式

      • 责任链模式

      • 观察者模式

      • 迭代子模式

      • 命令模式

      • 备忘录模式

      • 状态模式

      • 访问者模式

      • 中介者模式

      • 解释器模式

  • 工厂模式是解决对象创建问题的,所以工厂模式属于创建型设计模式。这里为什么学习工厂模式呢?这是因为Spring框架底层使用了大量的工厂模式。

工厂模式主要分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。以下是详细介绍:

1. 简单工厂模式(Simple Factory)

定义:通过一个工厂类来决定实例化哪一个产品类。简单工厂模式并不是GoF中的23种设计模式之一,但它常被认为是一种工厂模式的基本实现。

结构

  • 工厂类:负责根据传入的参数决定创建哪一种具体的产品实例。
  • 产品类:所有产品的父类或者接口,定义所有产品共有的接口。
  • 具体产品类:具体的产品类,工厂类将根据不同条件实例化这些具体类。

优点

  • 客户端不需要关心对象的创建细节,只需调用工厂即可获取对象。

缺点

  • 工厂类可能过于复杂,违背了“开放-关闭原则”(对扩展开放,对修改关闭)。每当添加新产品时,必须修改工厂类代码。

示例

public class SimpleFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ProductA();
        } else if ("B".equals(type)) {
            return new ProductB();
        }
        return null;
    }
}

2. 工厂方法模式(Factory Method)

定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使得一个类的实例化延迟到子类。

结构

  • 抽象工厂类:声明了工厂方法,定义了创建对象的接口。
  • 具体工厂类:实现了工厂方法,负责具体的产品创建。
  • 产品接口:定义产品的接口。
  • 具体产品类:实现产品接口的具体产品。

优点

  • 符合“开放-关闭原则”,当需要增加新产品时,不需要修改已有代码,只需增加新的工厂类和产品类。

缺点

  • 增加了代码的复杂性,每增加一个新的产品,都需要增加一个新的工厂类。所以可能会出现类爆炸。

示例

// 抽象产品类
public interface Product {
    void use();
}

// 具体产品类
public class ProductA implements Product {
    public void use() {
        System.out.println("Using ProductA");
    }
}

// 抽象工厂类
public abstract class Factory {
    public abstract Product createProduct();
}

// 具体工厂类
public class ProductAFactory extends Factory {
    public Product createProduct() {
        return new ProductA();
    }
}

3. 抽象工厂模式(Abstract Factory)

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

结构

  • 抽象工厂类:声明了创建不同产品的方法。
  • 具体工厂类:实现了不同产品族的创建。
  • 抽象产品类:定义产品的共同接口。
  • 具体产品类:实现抽象产品接口的具体产品。

优点

  • 提供了产品族的概念,可以保证同一产品族中的对象一致性。

缺点

  • 增加了系统的复杂性,当需要添加新的产品族时,所有的工厂类都需要进行修改,违背了“开放-关闭原则”。

示例

// 抽象产品A类
public interface ProductA {
    void use();
}

// 抽象产品B类
public interface ProductB {
    void eat();
}

// 具体产品A类
public class ProductA1 implements ProductA {
    public void use() {
        System.out.println("Using ProductA1");
    }
}

// 具体产品B类
public class ProductB1 implements ProductB {
    public void eat() {
        System.out.println("Eating ProductB1");
    }
}

// 抽象工厂类
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂类
public class ConcreteFactory1 implements AbstractFactory {
    public ProductA createProductA() {
        return new ProductA1();
    }
    
    public ProductB createProductB() {
        return new ProductB1();
    }
}

工厂模式的优缺点

优点:

  1. 封装对象创建:将对象的创建过程封装起来,避免了直接使用 new 操作符。
  2. 符合单一职责原则:工厂负责对象创建,业务逻辑中不关心对象的生成。
  3. 符合开闭原则:尤其是工厂方法模式和抽象工厂模式,通过扩展工厂类和产品类,可以实现对现有代码的扩展而不修改原有代码。

缺点:

  1. 代码复杂性增加:尤其是工厂方法和抽象工厂模式,需要定义多个接口和类,增加了系统的复杂度。
  2. 不适合少量产品:对于产品种类较少的情况,使用工厂模式可能过度设计。

适用场景

  • 当创建对象的逻辑复杂,并且需要集中管理时使用简单工厂模式。
  • 当创建的对象具有相同接口但具有不同实现时使用工厂方法模式。
  • 当系统中存在多个产品族,并且需要保证产品之间的相互一致性时使用抽象工厂模式。

通过工厂模式,代码可以保持更好的可维护性、可扩展性和灵活性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值