简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一个通用的接口来创建各种不同类型的对象,而无需直接暴露对象的创建逻辑给客户端。
简单工厂的三个重要角色:
工厂类(Factory Class):负责创建具体产品的实例。它通常包含一个静态方法,根据不同的参数返回不同的具体产品实例。
抽象产品类(Abstract Product Class):定义了具体产品的共同接口或抽象类,所有具体产品都实现该接口或继承自该抽象类。
具体产品类(Concrete Product Class):实现了抽象产品类定义的接口或继承了抽象产品类。
简单工厂模式的使用步骤如下:
定义好抽象产品类和具体产品类。
创建工厂类,其中包含一个静态方法,根据不同的参数返回不同的具体产品实例。
在客户端中通过调用工厂类的静态方法来获取具体产品的实例。
简单工厂的实践
当实践简单工厂模式时,首先需要创建一个工厂类,该类负责根据不同的条件来创建并返回具体的产品实例。
以下是一个示例的简单工厂模式的代码实现:
// 定义产品接口
interface Product {
void operation();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("具体产品A的操作");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("具体产品B的操作");
}
}
// 工厂类
class SimpleFactory {
// 根据传入的参数创建具体产品的实例
public static Product createProduct(String productType) {
if (productType.equalsIgnoreCase("A")) {
return new ConcreteProductA();
} else if (productType.equalsIgnoreCase("B")) {
return new ConcreteProductB();
} else {
return null;
}
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
// 创建产品A
Product productA = SimpleFactory.createProduct("A");
productA.operation(); // 输出:具体产品A的操作
// 创建产品B
Product productB = SimpleFactory.createProduct("B");
productB.operation(); // 输出:具体产品B的操作
}
}
在上述示例中,Product
是产品接口,ConcreteProductA
和 ConcreteProductB
是具体产品类。SimpleFactory
是工厂类,其中的 createProduct
方法根据传入的参数来创建并返回具体产品的实例。
在 Main
类中,我们通过调用工厂类的 createProduct
方法来创建不同类型的产品实例,并进行相应的操作。
在上述示例中,Product 是产品接口,ConcreteProductA 和 ConcreteProductB 是具体产品类。SimpleFactory 是工厂类,其中的 createProduct 方法根据传入的参数来创建并返回具体产品的实例。
在 Main 类中,我们通过调用工厂类的 createProduct 方法来创建不同类型的产品实例,并进行相应的操作。
简单工厂模式的优缺点:
简单工厂模式的优点:
封装了对象的创建逻辑:通过使用简单工厂模式,可以将对象的创建逻辑封装到一个工厂类中,客户端只需要知道如何使用工厂类来获取所需的对象,而不需要关心具体的对象创建过程。
降低了客户端与具体产品类之间的耦合度:客户端只依赖于抽象产品类和工厂类,不需要直接与具体产品类打交道,从而降低了耦合度,使得系统更加灵活和可维护。
提供了一种简单且通用的方式创建对象:简单工厂模式可以根据传入的参数或条件来动态创建不同类型的对象,从而提供了一种简单且通用的方式来创建对象。
简单工厂模式的缺点:
不符合开闭原则:当需要新增加新的具体产品类时,需要修改工厂类的代码,违反了开闭原则(对扩展开放,对修改关闭)。
工厂类职责过重:在简单工厂模式中,工厂类负责创建所有的具体产品对象,随着具体产品类的增多,工厂类的职责会变得很重,导致代码复杂化。
不易于扩展和维护:随着具体产品类的增加,工厂类的代码会不断膨胀,不易于扩展和维护。