在软件设计中,工厂模式(Factory Pattern)是创建型设计模式的一种,它提供了一种创建对象的最佳方法。工厂模式通过使用一个创建对象的接口,将对象的实例化延迟到子类中。这种模式使得代码更具灵活性和可维护性。
工厂模式的概念
工厂模式主要分为三种类型:
-
简单工厂模式(Simple Factory Pattern):不是一种标准的设计模式,但在实际开发中非常常见。它提供一个创建对象的静态方法,根据传入的参数决定创建哪种类的实例。
-
工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
-
抽象工厂模式(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
实现思路
拿到这个问题,我们首先考虑如何使用工厂模式来设计这个积木工厂系统。工厂模式可以有效地管理不同类型积木的创建,使代码更加清晰和可维护。
代码实现
-
主类
Main
:处理用户输入并调用工厂创建相应的积木。 -
接口
Shape
:定义积木的生产方法。 -
具体实现类
Circle
和Square
:实现了Shape
接口,分别生产圆形和方形积木。 -
工厂类
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;
}
}
代码解释
-
主类
Main
:-
从控制台读取输入次数
n
,并使用循环读取每一行的积木类型和数量。 -
使用
BlockFactory
工厂类获取相应的积木对象,并调用create
方法生产积木。
-
-
接口
Shape
:-
定义了生产积木的方法
create
。
-
-
具体实现类
Circle
和Square
:-
实现了
Shape
接口的create
方法,分别输出相应类型的积木信息。
-
-
工厂类
BlockFactory
:-
通过
getShape
方法,根据传入的积木类型返回相应的积木对象。 -
使用了
equalsIgnoreCase
方法来忽略大小写比较。
-
结论
通过使用工厂模式,我们成功地设计了一个灵活且可扩展的积木生产系统。工厂模式不仅提高了代码的可维护性和复用性,还使系统能够轻松地扩展新的积木类型。希望通过这个案例,大家能更好地理解和应用工厂模式及其在实际开发中的应用。
工厂模式是设计模式中的重要组成部分,掌握它可以大大提高代码的设计质量和可维护性。希望这篇博客能帮助你更好地理解工厂模式,并在实际开发中灵活应用。