什么是工厂?
在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。
什么是工厂方法模式?
工厂方法模式(英语: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);
优缺点
优点:
- 解耦,客户端不需要在负责对象的创建, 明确了各个类的职责。
- 扩展性高,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可。
缺点:
增加了类的数量,增加系统复杂度。
工厂方法的简化版本 - 简单工厂模式(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...