工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

    使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,”POP3”、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。

    注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

    假设接口Car, 他有三个接口

    1. public interface Car {
    2. public void run();
    3. }

    BZCar

    1. public class BZCar implements Car{
    2. public void run() {
    3. System.out.println("跑的是奔驰车!");
    4. }
    5. }

    BTCar

    1. public class BTCar implements Car{
    2. public void run() {
    3. System.out.println("跑的是本田车!");
    4. }
    5. }

    BMCar

    1. public class BMCar implements Car{
    2. public void run() {
    3. System.out.println("跑的是宝马车!");
    4. }
    5. }

    使用枚举代替配置文件

    1. public enum CarEnum {
    2. BM_CAR(1, "宝马车"),
    3. BZ_CAR(2, "奔驰车"),
    4. BT_CAR(3, "本田车");
    5. CarEnum(int val, String desc){
    6. this.val = val;
    7. this.desc = desc;
    8. }
    9. private int val;
    10. private String desc;
    11. public int getVal() {
    12. return val;
    13. }
    14. public void setVal(int val) {
    15. this.val = val;
    16. }
    17. public String getDesc() {
    18. return desc;
    19. }
    20. public void setDesc(String desc) {
    21. this.desc = desc;
    22. }
    23. }

    使用工厂来创建 就是new 不同的Car

    1. public class CarFactory {
    2. /**
    3. * carType可以写在配置文件中 用枚举代替
    4. * @param carType
    5. */
    6. public Car getCar(int carType){
    7. Car car = null;
    8. if(carType == CarEnum.BT_CAR.getVal()){
    9. car = new BTCar();
    10. }else if(carType == CarEnum.BM_CAR.getVal()){
    11. car = new BMCar();
    12. }else if(carType == CarEnum.BZ_CAR.getVal()){
    13. car = new BZCar();
    14. }
    15. return car;
    16. }
    17. }

    执行测试

    1. public class FactoryMain {
    2. public static void main(String[] args) {
    3. CarFactory carFactory = new CarFactory();
    4. Car car1 = carFactory.getCar(1);
    5. car1.run();
    6. Car car2 = carFactory.getCar(2);
    7. car2.run();
    8. Car car3 = carFactory.getCar(3);
    9. car3.run();
    10. }
    11. }