工厂模式

    xiaoxiao2024-12-26  89

    目录

    前言

    简单工厂模式

    工厂方法模式

    抽象工厂模式

    总结


    前言

    工厂模式的思想在实际开发中也算是比较常用的一种设计模式了,其本质就是为了在创建时不必显示指定创建的类型,将创建对象的具体过程隔离起来,实现解耦的最终大目标。从另一方面来说,使用工厂模式也有利于统一管理。一般说来有三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式。下面一一举例说明

     

    简单工厂模式

    类比于最初的工业革命那时候出现的工厂,假设有个客户如果想购买宝马,他并不需要知道怎么去创建它,只需要告诉工厂我想要一辆宝马,工厂自然会代你创建然后转交给你,你无需关注过程,只要最后到你手上的是一辆宝马就ok,这就是最简单的工厂模式的现实意义。下面贴代码

    1、首先新建一个汽车接口,提供生产方法

    public interface Car { void create(); }

    2、定义宝马类和奔驰类

    public class BMW implements Car{ @Override public void create() { System.out.println("宝马已经建好"); } } public class Benz implements Car { @Override public void create() { System.out.println("奔驰已经建好"); } }

    3、新建简单工厂类,我们只需调用生成车的方法并传入对应车型,工厂类就会帮我们自动创建

    public class SimpleCarFactory { public static final int BMW_TYPE = 1; public static final int BENZ_TYPE = 2; public static Car createCar(int type) { switch (type) { case BMW_TYPE : return new BMW(); case BENZ_TYPE : return new Benz(); default : return null; } } }

    4、新建测试类

    public class FactoryTest { @Test public void test() { Car bmw = SimpleCarFactory.createCar(SimpleCarFactory.BMW_TYPE); bmw.create(); Car benz = SimpleCarFactory.createCar(SimpleCarFactory.BENZ_TYPE); benz.create(); } }

    5、结果显示:

    宝马已经建好 奔驰已经建好 Process finished with exit code 0

    简单工厂模式其实在这三种工厂中可能是用的最多的了,一般都辅以Map来使用,即无需每次执行new操作,可以提前缓存。

     

    工厂方法模式

    我们再想想简单工厂模式上的那个小例子,客户只需告诉工厂想要的车型,简单工厂就给你创建,可是你今天要宝马,明天要奔驰,从现实角度来考虑,哪有一个工厂能生成所有的车型呢?因此每种车型的车都需要对应的生产工厂,工厂方法模式便由此而来

    1、为了统一管理所有工厂,我们需要新建一个工厂接口,并提供返回对应车型的基类方法

    public interface Factory { Car createCar(); }

    2、新增宝马工厂和奔驰工厂

    public class BMWFactory implements Factory{ @Override public Car createCar() { return new BMW(); } } public class BenZFactory implements Factory { @Override public Car createCar() { return new Benz(); } }

    3、测试

    @Test public void test01() { BMWFactory bmwFactory = new BMWFactory(); bmwFactory.createCar().create(); BenZFactory benZFactory = new BenZFactory(); benZFactory.createCar().create(); }

    工厂方法模式可以说是抽象工厂模式的一种特殊使用方式,下面介绍抽象工厂模式

     

    抽象工厂模式

    由上面的小例子可知,如果客户今天想要宝马,那他就得去对应的宝马工厂让他们生产,如果明天他想要奔驰,还得自己跑过去找奔驰工厂生产,这不是很不方便嘛,最理想的情况就是我想要宝马,我们只需告诉一个基本工厂,然后由这个工厂去帮我们找对应的工厂实现类。这就是我们的抽象工厂模式

    1、新建底层的抽象工厂类

    public abstract class AbstractFactory { abstract Car getCar(int type); }

    2、新建抽象工厂类的默认实现工厂,根据传入的不同车型找到对应的工厂予以生产

    public class CarFactory extends AbstractFactory { public static final int BMW_TYPE = 1; public static final int BENZ_TYPE = 2; @Override Car getCar(int type) { switch (type) { case BMW_TYPE : return new BMWFactory().createCar(); case BENZ_TYPE : return new BenZFactory().createCar(); default : return null; } } }

    3、测试

    @Test public void test02() { CarFactory carFactory = new CarFactory(); Car bmw = carFactory.getCar(CarFactory.BMW_TYPE); Car benz = carFactory.getCar(CarFactory.BENZ_TYPE); }

    抽象工厂模式在实际开发中,比较适合用在各生产者之间均有级联关系的场景,例如工厂->宝马工厂等

     

    总结

    而我们在真正使用工厂模式时不必拘泥于使用上述三种中的具体哪一种,我们是为了实现需求即封装创建过程并完成解耦的目标,那么只要最后实现了这一目标,你用了简单工厂还是工厂方法又有什么区别呢?或许修改几行代码往往又变成了抽象工厂~

     

    最新回复(0)