工厂模式

作用

实现了创建者和调用者的分离

  • 简单工厂模式

  • 工厂方法模式

  • 抽象工厂模式

核心本质

  • 实例化对象不使用new,用工厂方法代替
  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

简单工厂模式

用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)

工厂方法模式

用来生产同一等级结构中的固定产品(支持增加任意产品)

抽象工厂模式

围统一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

原来的设计

Car接口

public interface Car {
    void name();
}

Tesla实现Car接口

public class Tesla implements Car{

    @Override
    public void name() {
        System.out.println("特斯拉!");
    }
}

WuLing实现Car接口

public class WuLing implements Car{

    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

Consumer

public class Consumer {
    public static void main(String[] args) {
        Car car1 = new WuLing();
        Car car2 = new Tesla();
        car1.name();
        car2.name();

    }
}

image-20220925113845689

面向对象的话,你买车不需要知道具体,只需要知道什么车,你new车相当于造车,我们只需要从工厂里买

新建一个工厂,我们只需要告诉工厂要什么车,就可以得到。不用管细节

public class CarFactory {
    public static Car getCar(String car) {
        if (car.equals("五菱")) {
            return new WuLing();
        } else if (car.equals("特斯拉")) {
            return new Tesla();
        }else {
            return null;
        }
    }

消费者

  //使用工厂
        Car car = CarFactory.getCar("五菱");
        car.name();

工厂的缺点

在加个车大众,还需要在CarFactory中修改,违反了开闭原则

这样写,虽然不用改原来的逻辑了,但还是要增加一些新代码

image-20220925114953379

消费者不用去关心细节

image-20220925145315389

工厂方法模式

每个车的工厂类实现工厂接口,然后消费者只需要调用对应工厂就可以得到车

当新加一个车的时候,只需要增加对应工厂类实现工厂接口

Car接口

public interface Car {
    void name();
}

所有车都要实现Car接口

public class Tesla implements Car {

    @Override
    public void name() {
        System.out.println("特斯拉!");
    }
}
public class WuLing implements Car {

    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

CarFactory接口

public interface CarFactory {
    Car getCar();
}

所有的工厂都必须实现工厂接口

public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}
public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

新增的时候,加一个车类加一个工厂类,符合开闭原则

public class MoBai implements Car{

    @Override
    public void name() {
        System.out.println("摩拜单车");
    }
}

消费者

public class Consumer {
    public static void main(String[] args) {
        Car car = new WuLingFactory().getCar();
        Car car1 = new MoBaiFactory().getCar();
        car.name();
        car1.name();
    }
}

工厂方法模型

image-20220925151040263

image-20220925151241037

工厂类越来越多


结构复杂度:简单工厂模式低

代码复杂度:简单工厂模式低

编程复杂度:简单工厂模式低

管理复杂度:简单工厂模式低

根据设计原则:使用工厂方法模式

实际业务:简单工厂模式


Q.E.D.


春风亦有春风愁,不劳春风为我忧