简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,又称静态工厂模式(Static Factory Method)。简单工厂模式的核心是一个工厂类,这个工厂类负责创建不同类型的对象,而客户端代码只需要调用工厂类的方法即可创建对象,无需关心对象的具体创建过程。
核心:定义一个工厂类,根据传入的不同参数创建不同的产品实例
简单工厂模式的结构:
简单工厂模式包含以下三个角色:
- 工厂类(Factory): 负责创建不同类型的对象。
- 抽象产品类(AbstractProduct): 定义所有产品的公共接口。
- 具体产品类(ConcreteProduct): 实现抽象产品类,代表不同的产品类型。
示例
假设我们要创建一个汽车工厂,该工厂可以生产不同类型的汽车,例如奔驰汽车和宝马汽车。
// 汽车接口
interface Car {
void run();
}
// 比亚迪汽车类
class BYD implements Car {
@Override
public void run() {
System.out.println("比亚迪汽车正在行驶");
}
}
// 问界汽车类
class AITO implements Car {
@Override
public void run() {
System.out.println("AITO汽车正在行驶");
}
}
// 汽车工厂类
class CarFactory {
public static Car createCar(String type) {
if ("AITO".equals(type)) {
return new AITO();
} else if ("BYD".equals(type)) {
return new BYD();
} else {
return null;
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Car car = CarFactory.createCar("BYD");
car.run();
Car car2 = CarFactory.createCar("AITO");
car2.run();
}
}
CarFactory
类是一个简单工厂类,它负责创建不同类型的汽车。客户端代码只需要调用 CarFactory.createCar()
方法,并传入汽车类型,即可获得相应的汽车对象。
应用场景
简单工厂模式适用于以下场景:
- 当客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时。
- 产品种类较少且相对固定的情况,例如农场公司只会销售几种水果。
- 需要动态生成使用者所需类的对象,而使用者不用去知道怎么创建对象,使得各个模块各司其职,降低了系统的耦合性。
优缺点
优点:
- 将创建实例的工作与使用实例的工作分开,实现了解耦。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。
缺点:
- 违反了开闭原则: 如果需要添加新的产品类型,就需要修改工厂类,违反了开闭原则(对扩展开放,对修改封闭)。
- 工厂类承担了过多的职责: 工厂类负责创建所有类型的对象,如果产品类型过多,工厂类会变得过于复杂。
开闭原则(Open/Closed Principle,OCP) 是面向对象设计中的一项重要原则,它指出:
软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
这意味着,当需要添加新功能或修改现有功能时,应该通过扩展现有代码的方式来实现,而不是修改现有的代码。
简单工厂模式违反开闭原则的原因:
在简单工厂模式中,工厂类负责创建所有类型的对象。当需要添加新的产品类型时,就需要修改工厂类的代码,添加新的创建逻辑。这违反了开闭原则,因为我们修改了现有的代码,而不是扩展它。
工厂方法模式可以改进简单工厂模式:工厂方法模式(一文理解)-CSDN博客