Java基础:设计模式之简单工厂模式

发布于:2024-04-25 ⋅ 阅读:(27) ⋅ 点赞:(0)

简单工厂模式是一种创建型设计模式,它通过一个专门的类(即工厂类)负责创建对象,从而将对象的创建过程与客户端代码解耦。简单工厂模式的核心在于提供一个统一的入口,接收外界请求并根据请求参数返回相应的对象实例,隐藏了对象的具体创建细节。

一、简单工厂模式的结构

简单工厂模式涉及以下几个角色:

  1. 工厂类(Factory):这是模式的核心,它负责创建具体的产品对象。通常包含一个静态工厂方法,根据传入的参数判断应该创建何种产品对象,并返回该对象的实例。

  2. 抽象产品(Abstract Product):定义了产品对象的公共接口,通常是一个接口或抽象类,包含了所有具体产品必须实现的方法。

  3. 具体产品(Concrete Products):实现了抽象产品的接口,代表了可创建的不同产品对象。每个具体产品对应工厂类中的一个特定产品类型。

二、简单工厂模式的工作原理

当客户端需要创建一个产品对象时,不直接调用具体产品类的构造函数,而是通过调用工厂类的静态工厂方法。工厂方法根据传入的参数(如产品类型标识)决定应该实例化哪个具体产品类,并返回该对象的实例。客户端只知道传入参数和抽象产品接口,无需关心产品对象的实际创建过程。

三、Java示例

假设甜品店可以制作绿豆沙和芝麻糊两种甜品。我们可以创建一个甜品(Dessert)接口和两个具体甜品类(MungBeanSoup、BlackSesamePaste),再使用一个甜品工厂(DessertFactory)来创建甜品。

// 抽象产品(Abstract Product)
public interface Dessert {
    String getName();
}

// 具体产品(Concrete Products)
public class MungBeanSoup implements Dessert {
    @Override
    public String getName() {
        return "绿豆沙";
    }
}

public class BlackSesamePaste implements Dessert {
    @Override
    public String getName() {
        return "芝麻糊";
    }
}

// 工厂类(Factory)
public class DessertFactory {
    public static Dessert createDessert(String type) {
        if ("绿豆沙".equals(type)) {
            return new MungBeanSoup();
        } else if ("芝麻糊".equals(type)) {
            return new BlackSesamePaste();
        } else {
            throw new IllegalArgumentException("无法识别的甜品类型");
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Dessert dessert = DessertFactory.createDessert("绿豆沙");
        System.out.println("制作了一份:" + dessert.getName());
    }
}

在这个示例中,DessertFactory是简单工厂,createDessert方法是静态工厂方法。客户端通过传递字符串参数指定要创建的甜品种类,工厂根据参数返回相应的甜品实例。

四、简单工厂模式的问题

虽然简单工厂模式简化了对象的创建过程,但它也存在一些局限性和潜在问题:

  1. 违反开闭原则:当需要添加新的产品类型时,必须修改工厂类的代码,增加新的分支判断。这意味着每次扩展产品集时,都需要修改工厂类,违反了开闭原则(对扩展开放,对修改关闭)。随着产品种类的增多,工厂类可能会变得庞大且难以维护。

  2. 集中式逻辑:所有的产品创建逻辑都集中在工厂类中,如果创建过程复杂或者有大量产品类型,会导致工厂类的职责过重,不易于理解和测试。

  3. 无法应对复杂的创建条件:当产品创建逻辑依赖于复杂的逻辑判断或需要访问外部资源时,简单工厂模式可能无法优雅地处理这些情况,需要引入更复杂的设计。

  4. 不符合单一职责原则:工厂类除了负责创建对象外,还承担了识别产品类型的任务,这可能导致职责不单一,增加了代码的耦合度。

综上所述,简单工厂模式适用于产品种类相对较少且创建逻辑较为简单的情况。当系统需要支持灵活的产品扩展且遵循开闭原则时,可能需要考虑使用工厂方法模式或抽象工厂模式来替代。