推荐答案
- 简单工厂模式:通过一个工厂类根据传入的参数决定创建哪种产品类的实例。它不属于 GoF 23 种设计模式,但是一种常用的编程习惯。
- 工厂方法模式:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。
- 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通常用于创建产品族。
本题详细解读
简单工厂模式
简单工厂模式的核心是一个工厂类,它负责根据客户端传递的参数来创建不同类型的对象。这种模式的优点是客户端不需要知道具体的类名,只需要知道工厂类和参数即可。缺点是当需要增加新的产品时,必须修改工厂类的代码,违反了开闭原则。
// www.javascriptcn.com code example
public class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ProductA();
} else if (type.equals("B")) {
return new ProductB();
}
return null;
}
}工厂方法模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式将对象的实例化推迟到子类,从而使得子类可以在不修改代码的情况下扩展系统的功能。
// www.javascriptcn.com code example
public abstract class Factory {
public abstract Product createProduct();
}
public class FactoryA extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
public class FactoryB extends Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}抽象工厂模式
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通常用于创建产品族,每个工厂类负责创建一组相关的产品。
// www.javascriptcn.com code example
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ProductA1();
}
@Override
public ProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ProductA2();
}
@Override
public ProductB createProductB() {
return new ProductB2();
}
}区别总结
- 简单工厂模式:一个工厂类负责所有产品的创建,适用于产品种类较少且不经常变化的场景。
- 工厂方法模式:每个产品对应一个工厂类,适用于产品种类较多且可能经常变化的场景。
- 抽象工厂模式:每个工厂类负责创建一组相关的产品,适用于需要创建产品族的场景。