Bootstrap

设计模式 - 工厂模式

在软件设计中,工厂模式(Factory Pattern)是创建型设计模式的一种,它提供了一种创建对象的最佳方法。工厂模式通过使用一个创建对象的接口,将对象的实例化延迟到子类中。这种模式使得代码更具灵活性和可维护性。

工厂模式 | 菜鸟教程 (runoob.com)

工厂模式的概念

工厂模式主要分为三种类型:

  1. 简单工厂模式(Simple Factory Pattern):不是一种标准的设计模式,但在实际开发中非常常见。它提供一个创建对象的静态方法,根据传入的参数决定创建哪种类的实例。

  2. 工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

  3. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

工厂模式的优缺点

优点

  • 解耦性:工厂模式将对象的创建和使用分离,使用者无需关心具体实现。

  • 可扩展性:增加新的产品时,只需要增加相应的工厂类,符合开闭原则(Open/Closed Principle)。

  • 复用性:工厂模式的代码可以在不同的项目中复用,提高了代码的复用性。

缺点

  • 类的复杂性增加:每增加一种产品都需要增加一个具体类和一个工厂类。

  • 系统结构复杂:随着产品种类的增加,系统结构会变得复杂。

工厂模式的应用场景

工厂模式适用于以下场景:

  • 当一个类不知道它所需要的对象的类时。

  • 当一个类希望由其子类来指定创建哪个对象时。

  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并希望将哪一个帮助子类是代理者的信息局部化时。

实例讲解:积木工厂

题目描述

小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。

【设计模式专题之工厂方法模式】2.积木工厂 (kamacoder.com)

输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。

接下来的 N 行,每行输入一个字符串和一个整数,字符串表示积木的类型。积木类型分为 "Circle" 和 "Square" 两种。整数表示该积木生产的数量

输出描述

对于每个积木,输出一行字符串表示该积木的信息。

输入示例
Circle 1
Square 2
Circle 1
输出示例
Circle Block
Square Block
Square Block
Circle Block
实现思路

拿到这个问题,我们首先考虑如何使用工厂模式来设计这个积木工厂系统。工厂模式可以有效地管理不同类型积木的创建,使代码更加清晰和可维护。

代码实现
  1. 主类Main:处理用户输入并调用工厂创建相应的积木。

  2. 接口Shape:定义积木的生产方法。

  3. 具体实现类CircleSquare:实现了Shape接口,分别生产圆形和方形积木。

  4. 工厂类BlockFactory:根据传入的积木类型创建相应的积木对象。

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine(); // 读取换行符
        
        BlockFactory factory = new BlockFactory();

        for (int i = 0; i < n; i++) {
            String shape = sc.next();
            int number = sc.nextInt();
            
            Shape block = factory.getShape(shape);
            if (block != null) {
                block.create(number);
            } else {
                System.out.println("Unknown shape type");
            }
        }

        sc.close();
    }
}

interface Shape {
    void create(int number);
}

class Circle implements Shape {
    public void create(int number) {
        for (int i = 0; i < number; i++) {
            System.out.println("Circle Block");
        }
    }
}

class Square implements Shape {
    public void create(int number) {
        for (int i = 0; i < number; i++) {
            System.out.println("Square Block");
        }
    }
}

class BlockFactory {
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("Circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("Square")) {
            return new Square();
        }
        return null;
    }
}

代码解释

  1. 主类Main

    • 从控制台读取输入次数n,并使用循环读取每一行的积木类型和数量。

    • 使用BlockFactory工厂类获取相应的积木对象,并调用create方法生产积木。

  2. 接口Shape

    • 定义了生产积木的方法create

  3. 具体实现类CircleSquare

    • 实现了Shape接口的create方法,分别输出相应类型的积木信息。

  4. 工厂类BlockFactory

    • 通过getShape方法,根据传入的积木类型返回相应的积木对象。

    • 使用了equalsIgnoreCase方法来忽略大小写比较。

结论

通过使用工厂模式,我们成功地设计了一个灵活且可扩展的积木生产系统。工厂模式不仅提高了代码的可维护性和复用性,还使系统能够轻松地扩展新的积木类型。希望通过这个案例,大家能更好地理解和应用工厂模式及其在实际开发中的应用。

工厂模式是设计模式中的重要组成部分,掌握它可以大大提高代码的设计质量和可维护性。希望这篇博客能帮助你更好地理解工厂模式,并在实际开发中灵活应用。

;