设计模式(3):工厂方法模式

尺有所短,寸有所长;不忘初心,方得始终。

一、什么是工厂方法模式

  • 工厂方法模式(Factory Method Pattern),也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

  • 在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

  • 工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

二、工厂方法模式的适用场景

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关心创建产品的细节,只关心产品的品牌。

三、工厂方法模式结构

  • 抽象产品角色(Product):定义产品的接口

  • 具体产品角色(ConcreteProduct) :实现接口产品的具体产品类

  • 抽象工厂角色(Creator) :声明工厂方法(FactoryMethod),返回一个产品

  • 真实的工厂(ConcreteCreator):实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例设计模式(3):工厂方法模式

四、工厂方法模式实现方式

  • 创建同一接口,抽象产品角色。声明对所有产品都有意义的行为方法。

  • 为每种产品创建产品的具体产品角色,实现抽象产品角色接口。

  • 定义抽象工厂角色,接口中定义一个工厂方法。该方法的返回类型必须遵循通用的产品接口。

  • 为每种产品定义一个真实的工厂, 并实现抽象工厂角色中的工厂方法, 将具体产品角色中的相关对象的创建移动到工厂方法中。

如果应用中的产品类型太多, 那么为每个产品创建子类并无太大必要, 这时也可以在子类中复用基类中的控制参数。

五、工厂方法模式的实现

工厂方法模式的实现其实是在简单工厂代码的基础上加以改造

  • 抽象工厂角色实现

    /**
    * 抽象工厂
    */

    public interface IFactory {
    //定义一个方法用于创建汽车工厂
    ICar CreateCar();
    }
  • 抽象产品角色实现

    /**
    * 抽象产品类代码
    */

    public interface ICar {
    void GetCar();
    }
  • 具体工厂角色实现

    /**
    * 具体工厂类:用于创建两厢车类
    */

    public class HatchbackFactory implements IFactory{
    @Override
    public ICar CreateCar() {
    return new HatchbackCar();
    }
    }
    /**
    * 具体工厂类:用于创建越野车类
    */

    public class JeepFactory implements IFactory{
    @Override
    public ICar CreateCar() {
    return new JeepCar();
    }
    }

    /**
    * 具体工厂类:用于创建跑车类
    */

    public class SportFactory implements IFactory{
    @Override
    public ICar CreateCar() {
    return new SportCar();
    }
    }
  • 具体产品角色实现   与简单工厂代码一致

    /**
    * 具体汽车 : 越野车
    */

    public class JeepCar implements ICar {

    @Override
    public void GetCar() {
    System.out.println("这是越野车");
    }
    }

    /**
    * 具体汽车 : 跑车
    */

    public class SportCar implements ICar {

    @Override
    public void GetCar() {
    System.out.println("这是跑车");
    }
    }

    /**
    * 具体汽车 : 两箱车
    */

    public class HatchbackCar implements ICar {

    @Override
    public void GetCar() {
    System.out.println("这是两箱车");
    }
    }
  • 客户端代码实现

    public static void main(String[] args) {
    IFactory factory = new JeepFactory();
    ICar car = factory.CreateCar();
    car.GetCar();
    }

六、工厂方法模式的优缺点

  • 优点

    • 工厂和具体产品之间的解耦
    • 遵循单一职责原则,将产品创建代码放在程序的单一位置, 易维护。
    • 遵循开闭原则,无需更改现有客户端代码, 就可以在程序中引入新的产品类型。
  • 缺点

    在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度。

七、工厂方法模式和简单工厂模式的区别

  • 简单工厂模式

    • 工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。

    • 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

  • 工厂方法模式

    • 客户端不知道它所需要的对象的类。

    • 抽象工厂类通过其子类来指定创建哪个对象。

八、总结

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

– END –


原文始发于微信公众号(星河之码):设计模式(3):工厂方法模式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27207.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!