Factory Pattern,是 Java 常用的设计模式之一。它提供了一种与创建逻辑无关的创建实例的能力。
本文主要介绍工厂模式的两种实现方式:简单工厂模式、工厂方法模式。希望通过两种实现方式来加深对工厂模式的理解。
简单工厂模式
简单工厂模式,又称静态工厂方法模式。由一个静态方法根据传入参数的不同,来实现动态生产不同产品类实例的功能。
一个简单的演示如下
演示代码
// 汽车产品接口类
public interface Car {
public void drive();
}
// 不同的汽车产品类
public class Audi implements Car {
@Override
public void drive() {
System.out.println("Driving AUDI Sedans");
}
}
public class Benz implements Car {
@Override
public void drive() {
System.out.println("Driving BENZ Sedans");
}
}
public class Bwm implements Car {
@Override
public void drive() {
System.out.println("Driving BWM Sedans");
}
}
// 简单工厂类
public class SimpleFactory {
public static Car drive(String carType) {
if (StringUtils.isBlank(carType)) {
throw new RuntimeException("carType can not be empty.");
}
Car car = null;
switch (carType.toLowerCase()) {
case "bwm":
car = new Bwm();
break;
case "benz":
car = new Benz();
break;
case "audi":
car = new Audi();
break;
default:
throw new RuntimeException("invalid data.");
}
return car;
}
}
// 测试类
public class SimpleFactoryTest {
@org.junit.Test
public void drive() {
Car car = SimpleFactory.drive("Bwm");
if (car != null) {
car.drive();
}
car = SimpleFactory.drive("BENZ");
if (car != null) {
car.drive();
}
car = SimpleFactory.drive("audi");
if (car != null) {
car.drive();
}
}
}
运行结果
工厂方法模式
工厂方法使用一个抽象工厂来代替简单工厂模式中的工厂类。
演示改成如下
演示代码
// 创建抽象工厂类
public abstract class CarFactory {
abstract public Car drive();
}
// 三个产品的实现类
public class AudiFactory extends CarFactory {
@Override
public Car drive() {
return new Audi();
}
}
public class BenzFactory extends CarFactory {
@Override
public Car drive() {
return new Benz();
}
}
public class BwmFactory extends CarFactory {
@Override
public Car drive() {
return new Bwm();
}
}
// 测试类
public class CarFactoryTest {
@org.junit.Test
public void drive() {
CarFactory factory = new BwmFactory();
Car car = factory.drive();
if (car != null) {
car.drive();
}
factory = new BenzFactory();
car = factory.drive();
if (car != null) {
car.drive();
}
factory = new AudiFactory();
car = factory.drive();
if (car != null) {
car.drive();
}
}
}
运行结果
抽象工厂模式
抽象工厂模式,是工厂方法模式的超级升级版本。引入了抽象工厂角色(AbstractFactory)的概念,通过抽象工厂角色来创建具体的工厂类。例如 通过 AbstractFactory 来创建不同的 Car 工厂类实例 PublicCarFactory、SportCarFactory、BusCarFactory 等。
不再详细展开
各个角色介绍
总结
工厂模式的存在,给我们创建具体实例带来了便利。特别是高配版的抽象工厂模式,在新产品需求出现的情况下,可以在不修改原有功能的基础上,通过扩展新的产品类、新的产品工厂类进行实现。