设计模式——工厂方法

112 阅读4分钟

工厂方法模式

工厂方法设计模式,看名字,跟上一篇《抽象工厂模式》名字很相近啊,那么这两种设计模式有什么区别呢?先来看看工厂方法的应用场景.

最近新能源汽车比较火爆哈,假设你是一个老板,投资了两个工厂来生产汽车。分别是小米、华为两个工厂。此时来看看使用工厂方法设计模式如何处理这类问题吧。

首先抽出来一个接口(抽象产品):

public interface ICar {
    void makeCar();
}

接下来就是两个具体产品类:

public class WenJieCar implements ICar{
    @Override
    public void makeCar() {
        System.out.println("别催啦~~问界M7正在努力生产中!!!");
    }
}
public class XiaoMiCar implements ICar{
    @Override
    public void makeCar() {
        System.out.println("别催啦~~小米SU7正在努力生产中!!!");
    }
}

接下来,我们定义一个抽象工厂(CarFactory)接口,其中包含一个工厂方法用于创建产品:

public interface CarFactory {  
    ICar createCar();  
}

然后,我们定义两个具体的工厂类(XiaoMiFactory 和 HuaWeiFactory),它们实现了 CarFactory 接口并返回自己的产品实例:

public class XiaoMiFactory implements CarFactory{
    @Override
    public ICar createCar() {
        return new XiaoMiCar();
    }
}
public class HuaWeiFactory implements CarFactory{
    @Override
    public ICar createCar() {
        return new WenJieCar();
    }
}

最后,客户端代码可以根据需要选择使用哪个工厂来创建产品:

public class CarTest {
    public static void main(String[] args) {
        CarFactory factory = new XiaoMiFactory();
        ICar car = factory.createCar();
        car.makeCar(); // 别催啦~~小米SU7正在努力生产中!!!

        CarFactory carFactory = new HuaWeiFactory();
        ICar factoryCar = carFactory.createCar();
        factoryCar.makeCar(); // 别催啦~~问界M7正在努力生产中!!!
    }
}

这时候肯定会有一些小伙伴们蒙圈了,那这跟抽象工厂设计模式有什么区别呢?让我们来看看上一篇中抽象设计模式中的测试类,来看看有啥不一样的(举的例子不相同,可能有些乱)

public class Test {
   public static void main(String[] args) {
       IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
       ICat blackCat = blackAnimalFactory.createCat();
       blackCat.eat();
       // 上面这三行是不是很像我们上述的例子,不同的是下面这两行
       IDog blackDog = blackAnimalFactory.createDog();
       blackDog.eat();
       // ...
   }
}

这时候我们来看看为什么会多了这两行?我们可以很清晰的发现了抽象工厂里面的好像不止一个抽象产品类,而我们的工厂方法模式好像只有一个是吧。

那让我们来看看他们之间的区别:

在工厂方法模式中,我们有一个抽象工厂(CarFactory)和一个或多个具体工厂(XiaoMiFactory, HuaWeiFactory),每个具体工厂负责创建一种类型的具体产品(XiaoMiCar, WenJieCar)。客户端代码使用抽象工厂接口与工厂进行交互,并调用工厂方法来获取产品。

而抽象工厂模式则更加复杂,它通常包含多个工厂方法(createCatcreateDog),每个工厂方法负责创建一种类型的产品IDogICat。抽象工厂模式允许客户端代码在一个工厂中获取一系列相关的产品对象,而无需知道这些产品对象的具体类。

小伙伴们听懂了嘛?肯定有小伙伴们跟我一样还是处于懵逼状态吧,我举个更加通俗易懂的例子。

小米造车工厂拥有造车这个功能(相当于实现了抽象工厂),只能生产小米商标的汽车,不能生产其他类型的产品。就是我们上面的工厂方法模式。

现在汽车分成了新能源和燃油车。此时CarFactory里面包含了两个工厂方法,分别返回新能源和燃油两种类型。小米,问界...都实现新能源接口。凯迪拉克...都实现燃油车系列。此时有若干工厂,比如SUV、轿车工厂都分别实现了CarFactory工厂。此时当我们需要一辆小米新能源SU7(轿车)时,调用新能源接口中创建车即可获得一辆小米SU7(轿车)或者是也能获得一辆燃油车版的轿车(ct5)。具体的代码就跟上一篇帖子中例子类似。

总的来说就是 在抽象工厂设计模式中,具体工厂确实可以生产同一特性但不同种类的物品。而工厂方法模式则相对简单一些,每个具体工厂只负责生产一种类型的产品。抽象工厂模式和工厂方法模式的主要区别在于它们处理产品的方式和灵活性。抽象工厂模式能够处理产品族,而工厂方法模式则更专注于单一类型产品的生产。