工厂模式

工厂模式

使命

工厂模式的出现是为了解决接口选择问题,当我们明确不同条件下创建不同实例时,可以选择工厂模式来创建实例。

优点
  • 1、调用者想创建对象只需知道其名称即可,不用关心创建细节
  • 2、拓展性高
  • 3、屏蔽创建实现,调用者只需关心接口
缺点
  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

造车工厂

下面我们将通过一个实例来体验一下工厂模式的应用,需求背景是一个卖车中介知道了一个超级工厂,这个工厂能创建各种车型,只需要中介把车型告诉给工厂就能造出来。我们将通过代码来实现这一场景

卖车中介
public class Client {
    public static void main(String[] args) {
        VehicleFactory factory = new VehicleFactory();

        IVehicle benz = factory.product("BENZ");
        benz.whistle();
        benz.drive();

        System.out.println("-------------------------------");

        IVehicle audi = factory.product("AUDI");
        audi.whistle();
        audi.drive();

        System.out.println("-------------------------------");

        IVehicle bmw = factory.product("BMW");
        bmw.whistle();
        bmw.drive();
    }
}
汽车接口
public interface IVehicle {

    /**
     * 鸣笛
     */
    void whistle();

    /**
     * 行驶
     */
    void drive();
}
奥迪汽车
public class Audi implements IVehicle {

    @Override
    public void whistle() {
        System.out.println("奥迪在鸣笛......");
    }

    @Override
    public void drive() {
        System.out.println("奥迪在行驶......");
    }
}

宝马汽车

public class BMW implements IVehicle {

    @Override
    public void whistle() {
        System.out.println("宝马在鸣笛......");
    }

    @Override
    public void drive() {
        System.out.println("宝马在行驶......");
    }
}
奔驰汽车
public class Benz implements IVehicle {

    @Override
    public void whistle() {
        System.out.println("奔驰在鸣笛......");
    }

    @Override
    public void drive() {
        System.out.println("奔驰在行驶......");
    }
}
汽车超级工厂
public class VehicleFactory {
    public IVehicle product(String name){
        IVehicle vehicle = null;
        if ("BENZ".equals(name)){
            vehicle = new Benz();
        }else if("BMW".equals(name)){
            vehicle = new BMW();
        }else if ("AUDI".equals(name)){
            vehicle = new Audi();
        }
        return vehicle;
    }
}

经验之谈

  • 工厂作为一种创建类模式,在需要生成复杂对象的地方都可以使用,但是如果是简单能用new可以完成创建对象就不必用上工厂模式了,这会增加系统维护的复杂度。
  • 工厂模式其实和策略模式很相似,工厂模式着重于创建的过程,只要把创建的对象交给调用者就完成使命了,而策略模式是要选择不同的策略,并且调用具体的接口方法。可以说工厂方法实现到下面就已经达到效果了

    public static void main(String[] args) {
        VehicleFactory factory = new VehicleFactory();
    
        IVehicle benz = factory.product("BENZ");
    
        IVehicle audi = factory.product("AUDI");
    
        IVehicle bmw = factory.product("BMW");
    
    }