写点什么

2. 工厂方法模式

作者:下雨了
  • 2022 年 4 月 03 日
  • 本文字数:1272 字

    阅读完需:约 4 分钟

概念及定义

工厂方法模式是对简单工厂模式的优化,在简单工厂模式的基础上引入了抽象工厂类,用以弥补简单工厂不易扩展性。


工厂方法模式的主要思想

通过定义抽象工厂类,然后为每个具体产品类定义对应的工厂实现类。通过具体的工厂实现类来生产对应的产品。


工厂方法模式中角色以及职责

  1. AbstractFactory(抽象工厂角色)

定义工厂的公共生产方法。


  1. Factory(工厂实现角色)

对公共生产方法重写,实现对应指定产品实现的生产。


  1. AbstractProduct(抽象产品角色)

定义产品的公共方法。


  1. Product(产品实现角色)

对公共方法重写,实现产品的独有特性。


工厂方法模式的优缺点

优点:

  1. 单一职责,工厂类负责产品对象的创建。

  2. 调用者只需要关心产品对应的工厂类,即可以创建出对应的具体产品,而不需要了解具体的产品类。

  3. 与简单工厂模式进行对比,在新增产品类别的时候,无需修改已有代码,直接新增对应的产品类与对应的产品工厂类即可,降低了耦合性。

缺点:

  1. 与简单共产模式进行对比,需要增加一个抽象工厂类与一些具体的工厂实现类,增加了代码的复杂度。


实现步骤:

  1. 定义 ICar 汽车接口:抽象产品角色

public interface ICar {    void drive();}
复制代码

2.定义 IFactory:抽象工厂角色

public interface IFactory {    ICar produceCar();}
复制代码

3.定义 T 具体汽车与具体汽车工厂类:

public class TeslaCar implements ICar{    @Override    public void drive() {        System.out.println("Tesla 滴滴滴");    }}
复制代码


public class TeslaFactory implements IFactory{    @Override    public ICar produceCar() {        return new TeslaCar();    }}
复制代码


public class VolkswagenCar implements ICar{    @Override    public void drive() {        System.out.println("Volkswagen 滴滴滴");    }}
复制代码


public class VolkswagenFactory implements IFactory{    @Override    public ICar produceCar() {        return new VolkswagenCar();    }}
复制代码


public class FactoryMethodPattern {    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {        //利用反射获取对应的工厂类        Class<?> FactoryClazz1 = Class.forName("VolkswagenFactory");        //利用反射创建工厂对象        IFactory carFactory1 = (AbstractFactory)FactoryClazz1.newInstance();        //利用工厂类生产产品对象        ICar volkswagen = carFactory1.produceCar();        //具体子类执行公共方法        volkswagen.drive();//Volkswagen 滴滴滴        Class<?> FactoryClazz2 = Class.forName("TeslaFactory");        IFactory carFactory2 = (AbstractFactory) FactoryClazz2.newInstance();        ICar tesla = carFactory2.produceCar();        tesla.drive();//Tesla 滴滴滴    }}
复制代码

总结:

由测试结果可见:

  1. 虽然都是 ICar 类型的产品,具体调用 drive 方法的,其实都是对应的子类。

  2. 工厂方法模式即实现:通过获取工厂类名,利用反射,即可得到对应的工厂实现类来生产对应的产品。

发布于: 刚刚阅读数: 4
用户头像

下雨了

关注

还未添加个人签名 2021.05.11 加入

还未添加个人简介

评论

发布
暂无评论
2.工厂方法模式_设计模式_下雨了_InfoQ写作平台