简介
工厂模式有三种:简单工厂模式、工厂模式、抽象工厂模式,简单工厂模式是最基础的一个,工厂模式的核心思想是把创建对象过程和对象本身业务处理分离。假设需要创建多个对象,每个对象的创建模式比较复杂,那么我们把这些过程放在逻辑代码中,会使得逻辑代码非常混乱;而且每当有新的产品出现,就需要修改逻辑代码,不符合“开闭原则”。
实现
- 抽象产品类:所有需要创建产品的基类,是个纯虚类
- 具体产品类:继承抽象产品,是根据需要添加的功能产品
- 产品工厂类:负责生产产品
类图如下
Car为抽象产品类 BenzCar、BMWCar、AudiCar为具体产品类 CarFactory为 产品工厂类
代码示例
/**
* @author: xuqiangnj@163.com
* @date: 2019/4/21 21:49
* @description: 车辆接口
*/
public interface Car {
void drive();
}
/**
* @author: xuqiangnj@163.com
* @date: 2019/4/21 21:52
* @description: 宝马车
*/
public class BMWCar implements Car {
public void drive() {
System.out.println("BMWCar run");
}
}
/**
* @author: xuqiangnj@163.com
* @date: 2019/4/21 21:51
* @description: 奔驰车
*/
public class BenzCar implements Car {
public void drive() {
System.out.println("BenzCar run");
}
}
/**
* @author: xuqiangnj@163.com
* @date: 2019/4/21 21:53
* @description: 奥迪车
*/
public class AudiCar implements Car {
public void drive() {
System.out.println("AudiCar run");
}
}
/**
* @author: xuqiangnj@163.com
* @date: 2019/4/21 21:49
* @description: 生产车辆工厂类
*/
public class CarFactory {
public static Car createCar(String carName) {
if (carName.equals("BenzCar")) {
return new BenzCar();
} else if (carName.equals("BMWCar")) {
return new BMWCar();
} else if (carName.equals("AudiCar")){
return new AudiCar();
}
return null;
}
}
/**
* @author: xuqiangnj@163.com
* @date: 2019/4/21 21:54
* @description: 测试类
*/
public class TestCar {
public static void main(String[] args) {
Car car = CarFactory.createCar("BMWCar");
car.drive();
car = CarFactory.createCar("BenzCar");
car.drive();
}
}
运行结果
客户端不需要直接使用具体的类,也无需知道工厂是怎样创建所需的具体产品类,隐藏了创建具体实现的细节,客户端只需要传入不同的参数来获取不同产品类,客户端与创建产品过程松耦合,可以在不修改客户端代码来更换和增加新的具体产品类,提高了系统灵活性
使用场景
在具体产品种类不多并且固定的情况下适用
总结
简单工厂所有产品有同一个工厂创建,并且需要判断参数来进行返回对应的产品,既需要判断逻辑,同时也需要创建产品,不符合单一职责原则,在添加和修改产品时,工厂类需要修改代码,不符合开闭原则,简单工厂存在一些不足,使用时需考虑场景是否适用
(转载请注明出处)