📜  设计模式-工厂模式(1)

📅  最后修改于: 2023-12-03 15:28:08.741000             🧑  作者: Mango

设计模式-工厂模式

工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们不必指定要创建的对象的确切类,而是使用一个工厂方法,该方法根据需要返回适当类对象的实例。

类型

工厂模式主要有三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式

简单工厂模式也被称为静态工厂模式。在简单工厂模式中,我们使用一个单一的类,该类决定实例化哪一个类对象。这种类型的工厂模式属于创建型模式,因为此模式提供了创建对象的方法。

代码实现:

public class SimpleFactory {
    public static Product createProduct(String type){
        switch (type) {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            default:
                throw new IllegalArgumentException("Unsupported product type: " + type);
        }
    }
}
工厂方法模式

在工厂方法模式中,我们定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这种类型的工厂模式属于创建型模式,因为此模式提供了创建对象的方法。

代码实现:

public interface Factory {
    Product createProduct();
}

public class ProductAFactory implements Factory {
    public Product createProduct() {
        return new ProductA();
    }
}

public class ProductBFactory implements Factory {
    public Product createProduct() {
        return new ProductB();
    }
}
抽象工厂模式

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种类型的工厂模式属于创建型模式,因为此模式提供了创建对象的方法。

代码实现:

public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

public class Factory1 implements AbstractFactory {
    public ProductA createProductA() {
        return new ProductA1();
    }
    public ProductB createProductB() {
        return new ProductB1();
    }
}

public class Factory2 implements AbstractFactory {
    public ProductA createProductA() {
        return new ProductA2();
    }
    public ProductB createProductB() {
        return new ProductB2();
    }
}
使用场景

当创建对象逻辑复杂或需要根据应用程序配置或环境创建对象时,使用工厂模式是一个明智的选择。例如,当您有多个可能的类并且您不知道要使用哪个时,您可以使用工厂模式来创建对象。

优点
  • 工厂模式提供了更好的封装,使代码的复杂性降低。
  • 工厂模式可以使代码更容易维护,因为它使创建代码与使用代码分开。
  • 工厂模式使得代码更加可扩展,因为你可以在代码中添加新的产品,而不必更改现有的代码。
缺点
  • 工厂模式会增加代码的复杂性,因为它需要新增工厂类和产品类。
  • 工厂模式需要处理抽象性更大,因为创建的对象可能需要在日后进行维护和更新。
应用实例

工厂模式在Java API中有广泛的应用,如Java的Calendar类就使用了工厂方法模式。在用户不知道具体日历类是什么情况下,Calendar可以通过静态方法getInstance()来获取一个实例化的对象。