设计模式:工厂模式

导读:本篇文章讲解 设计模式:工厂模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

三种工厂模式

  1. 简单工厂模式

    用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有的代码

  2. 工厂方法模式

    用来生产同一等级结构中的固定产品(支持增加任意产品

  3. 抽象工厂模式

    围绕一个超级工厂创建其他工厂

注:本文主要介绍了 工厂方法模式 !!!

工厂模式的定义

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

特点

“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则

  1. 被创建的对象称为“产品”;
  2. 创建产品的对象称为“工厂”;
  3. 创建与使用相分离;

优点与缺点

  • 优点
    • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
    • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
    • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
  • 缺点
    • 类的个数容易过多,增加复杂度。
    • 增加了系统的抽象性和理解难度。
    • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

应用场景

  • JDK 中 Calendar 的 getInstance 方法;
  • JDBC 中的 Connection 对象的获取;
  • Spring IOC 容器创建管理 Bean 对象;
  • 反射中 Class 对象的 newInstance 方法;

结构与实现

结构

工厂方法模式的主要角色如下:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

image-20211226165421191

实现

/**
 * 工厂模式
 *
 * @author Strive
 */
public class FactoryPattern {
  public static void main(String[] args) {
    CatFactory teslaFactory = new TeslaFactory();
    teslaFactory.productCar().name();

    CatFactory audiFactory = new AudiFactory();
    audiFactory.productCar().name();
  }
}

/** 汽车抽象工厂 */
interface CatFactory {
  /** 生产汽车 */
  Cat productCar();
}

/** 特斯拉工厂 */
class TeslaFactory implements CatFactory {

  @Override
  public Cat productCar() {
    return new Tesla();
  }
}

/** 奥迪工厂 */
class AudiFactory implements CatFactory {

  @Override
  public Cat productCar() {
    return new Audi();
  }
}

/** 产品的抽象类 */
interface Cat {
  /** 名称 */
  void name();
}

/** 特斯拉 */
class Tesla implements Cat {
  @Override
  public void name() {
    System.out.println("特斯拉 Model3");
  }
}

/** 奥迪 */
class Audi implements Cat {
  @Override
  public void name() {
    System.out.println("奥迪 A4L");
  }
}

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

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

(0)
小半的头像小半

相关推荐

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