Factory Method - 工厂方法设计模式

5 阅读2分钟

什么是工厂?

在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。

什么是工厂方法模式?

工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行

class Car {
    String name;
    void run() {
        System.out.println("Go!Go!Go!");
    };
}

class BenzCar extends Car {}
class AudiCar extends Car {}

interface ICarFactory {
    Car produce();
}

class BenzCarFactory implements ICarFactory {
    @Override
    public Car produce() {
        return new BenzCar();
    }
}

class AudiCarFactory implements ICarFactory {
    @Override
    public Car produce() {
        return new AudiCar();
    }
}

public static void main(String[] args) {
    final BenzCarFactory factory = new BenzCarFactory();
    final Car car = factory.produce();
    car.run();
}

”工厂方法“不限于“类”,而重点在于一种工厂的"思维",可以拓展到一些构造对象的静态方法中。

class Complex {
     public static Complex fromCartesianFactory(double real, double imaginary) {
         return new Complex(real, imaginary);
     }
     public static Complex fromPolarFactory(double modulus, double angle) {
         return new Complex(modulus * cos(angle), modulus * sin(angle));
     }
     private Complex(double a, double b) {
         //...
     }
}

Complex product = Complex.fromPolarFactory(1, pi);

优缺点

优点:

  1. 解耦,客户端不需要在负责对象的创建, 明确了各个类的职责。
  2. 扩展性高,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可。

缺点:
增加了类的数量,增加系统复杂度。

工厂方法的简化版本 - 简单工厂模式(Simple Factory)

简单工厂模式是对工厂方法的一种简化,正常情况下,具体产品和具体产品的工厂都是成对存在的,简单工厂就是只用一个单一的工厂类,基于不同的参数输入,返回不同的产品实例。我们把上面的示例改造一下:

abstract class Car {
    abstract void run();
}

class BenzCar extends Car {
    @Override
    void run() {
        System.out.println("Benz car run...");
    }
}

class AudiCar extends Car {
    @Override
    void run() {
        System.out.println("Audi car run...");
    }
}

class CarFactory {
    public Car produce(String brand) {
        switch (brand) {
            case "BENZ": return new BenzCar();
            case "AUDI": return new AudiCar();
        }
        return null;
    }
}

public static void main(String[] args) {
    final CarFactory factory = new CarFactory();
    factory.produce("BENZ").run();
}

Output:

Benz car run...