结构区别
- 简单工厂模式:
- 包含一个工厂类,该工厂类有一个创建产品的静态方法。工厂类负责创建具体的产品对象,客户端只需要调用工厂类的静态方法,并传入相应的参数来获取所需的产品。例如,有一个
CarFactory
类,它有一个静态方法createCar(String type)
,根据传入的type
参数创建不同类型的Car
对象。
- 结构相对简单,只有一个工厂类来负责所有产品的创建。
- 工厂方法模式:
- 有一个抽象的工厂类,定义了创建产品的抽象方法。具体的工厂类继承自抽象工厂类,并实现创建产品的抽象方法。客户端通过调用具体工厂类的方法来获取产品。例如,有一个抽象的
CarFactory
类,其中有抽象方法createCar()
,然后有SedanCarFactory
和SUVCarFactory
等具体工厂类继承CarFactory
并实现createCar()
方法。
- 结构比简单工厂模式复杂,引入了抽象工厂类,将工厂的创建逻辑进行了抽象,使得系统更具扩展性。
使用场景区别
- 简单工厂模式:
- 适用于产品种类较少且不会频繁增加新产品的场景。例如,一个小型的汽车制造模拟器,只生产轿车和SUV两种车型,使用简单工厂模式就可以方便地创建不同类型的汽车对象。
- 工厂方法模式:
- 适用于产品种类较多,且可能会经常增加新产品的场景。例如,一个大型的汽车制造公司,产品线丰富,不断有新的车型推出,使用工厂方法模式可以通过新增具体工厂类来创建新的产品,而不需要修改原有工厂类的代码。
优缺点区别
- 简单工厂模式:
- 优点:
- 实现简单,对于客户端来说使用方便,只需要调用工厂类的静态方法即可获取产品。
- 工厂类封装了产品的创建逻辑,客户端不需要了解产品的具体创建过程。
- 缺点:
- 不符合开闭原则,如果需要增加新的产品,就需要修改工厂类的代码,在
createCar
方法中添加新的if - else
分支或者switch - case
语句,这可能会导致已有代码的风险。
- 工厂方法模式:
- 优点:
- 符合开闭原则,当需要增加新的产品时,只需要新增一个具体工厂类并实现抽象工厂类的方法,不需要修改原有代码。
- 扩展性好,适合复杂多变的产品创建需求。
- 缺点:
- 相比简单工厂模式,代码结构更加复杂,需要定义抽象工厂类和多个具体工厂类,增加了系统的理解和维护成本。
代码示例
- 简单工厂模式代码示例:
// 产品接口
interface Car {
void drive();
}
// 具体产品1
class SedanCar implements Car {
@Override
public void drive() {
System.out.println("Driving a sedan car.");
}
}
// 具体产品2
class SUVCar implements Car {
@Override
public void drive() {
System.out.println("Driving an SUV car.");
}
}
// 简单工厂类
class CarFactory {
public static Car createCar(String type) {
if ("sedan".equals(type)) {
return new SedanCar();
} else if ("suv".equals(type)) {
return new SUVCar();
}
return null;
}
}
// 客户端代码
public class SimpleFactoryClient {
public static void main(String[] args) {
Car sedan = CarFactory.createCar("sedan");
if (sedan != null) {
sedan.drive();
}
Car suv = CarFactory.createCar("suv");
if (suv != null) {
suv.drive();
}
}
}
- 工厂方法模式代码示例:
// 产品接口
interface Car {
void drive();
}
// 具体产品1
class SedanCar implements Car {
@Override
public void drive() {
System.out.println("Driving a sedan car.");
}
}
// 具体产品2
class SUVCar implements Car {
@Override
public void drive() {
System.out.println("Driving an SUV car.");
}
}
// 抽象工厂类
abstract class CarFactory {
public abstract Car createCar();
}
// 具体工厂类1
class SedanCarFactory extends CarFactory {
@Override
public Car createCar() {
return new SedanCar();
}
}
// 具体工厂类2
class SUVCarFactory extends CarFactory {
@Override
public Car createCar() {
return new SUVCar();
}
}
// 客户端代码
public class FactoryMethodClient {
public static void main(String[] args) {
CarFactory sedanFactory = new SedanCarFactory();
Car sedan = sedanFactory.createCar();
if (sedan != null) {
sedan.drive();
}
CarFactory suvFactory = new SUVCarFactory();
Car suv = suvFactory.createCar();
if (suv != null) {
suv.drive();
}
}
}