当前位置: 首页 > news >正文

Java设计模式之《工厂模式》

目录

1、介绍

1.1、定义

1.2、优缺点

1.3、使用场景

2、实现

2.1、简单工厂模式

2.2、工厂方法模式

2.3、抽象工厂模式

3、小结


前言

        在面向对象编程中,创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例,但在某些情况下,new 操作符直接生成对象会存在一些问题。

举例来说,对象的创建需要一系列的步骤:

        可能需要计算或取得对象的初始位置、选择生成哪个子对象实例、或在生成之前必须先生成一些辅助对象。

         在这些情况,新对象的建立就是一个 “过程”,而不仅仅是一个操作,就像一部大机器中的一个齿轮传动。

        工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需指定具体的实现类。

Java设计模式分类,如下所示:


1、介绍

1.1、定义

         工厂模式将目的将创建对象的具体过程屏蔽隔离起来,从而达到更高的灵活性。

如下所示:

工厂模式可以分为三类:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(Abstract Factory)

1、在没有工厂的时代:

如果客户需要一款宝马车,那么就需要客户去创建一款宝马车,然后拿来用。

2、简单工厂模式:

        后来出现了工厂,用户不再需要去创建宝马车,由工厂进行创建,想要什么车,直接通过工厂创建就可以了。比如想要320i系列车,工厂就创建这个系列的车。

3、工厂方法模式:

        为了满足客户,宝马车系列越来越多,如320i、523i等等系列,一个工厂无法创建所有的宝马系列,于是又单独分出来多个具体的工厂,每个具体工厂创建一种系列,即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象,你需要指定某个具体的工厂才能生产车出来。

4、抽象工厂模式:

        随着客户要求越来越高,宝马车必须配置空调,于是这个工厂开始生产宝马车和需要的空调。最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车。

1.2、优缺点

  • 将对象的创建与使用分离。

  • 降低系统的耦合度。

  • 便于扩展新的产类型。

1.3、使用场景

  1. 如果只是创建单个对象的不同实现(如不同的数据库连接),用工厂方法。

  2. 如果需要创建配套的一组对象(如不同操作系统的UI组件套件),用抽象工厂


2、实现

2.1、简单工厂模式

// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 简单工厂
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Unknown product type");}
}// 使用示例
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();  // 输出: Using Product AProduct productB = SimpleFactory.createProduct("B");productB.use();  // 输出: Using Product B}
}

2.2、工厂方法模式

相比较于抽象工厂模式,可以对接口的实现纵向扩展。

// 产品接口
interface Engine {void start();
}// 具体产品
class ElectricEngine implements Engine {public void start() { System.out.println("电动机启动"); }
}class FuelEngine implements Engine {public void start() { System.out.println("燃油发动机启动"); }
}// 工厂接口(只生产发动机)
interface EngineFactory {Engine createEngine();
}// 具体工厂
class ElectricEngineFactory implements EngineFactory {public Engine createEngine() { return new ElectricEngine(); }
}class FuelEngineFactory implements EngineFactory {public Engine createEngine() { return new FuelEngine(); }
}// 使用示例
public class Main {public static void main(String[] args) {EngineFactory ef = new ElectricEngineFactory();Engine engine = ef.createEngine();engine.start(); // 输出: 电动机启动}
}

特点

  • 只生产发动机这一种产品

  • 如果要新增空调组件,需要另写一套空调工厂

2.3、抽象工厂模式

相比于工厂方法模式,抽象工厂模式,可以横向扩展。

// 产品族接口
interface Engine {void start();
}interface AirConditioner {void cool();
}// 电动系列产品
class ElectricEngine implements Engine {public void start() { System.out.println("电动机启动"); }
}class ElectricAirConditioner implements AirConditioner {public void cool() { System.out.println("电子变频空调工作"); }
}// 燃油系列产品
class FuelEngine implements Engine {public void start() { System.out.println("燃油发动机启动"); }
}class FuelAirConditioner implements AirConditioner {public void cool() { System.out.println("机械压缩机空调工作"); }
}// 抽象工厂接口(能生产整套组件)
interface CarFactory {Engine createEngine();AirConditioner createAirConditioner();
}// 具体工厂
class ElectricCarFactory implements CarFactory {public Engine createEngine() { return new ElectricEngine(); }public AirConditioner createAirConditioner() { return new ElectricAirConditioner(); }
}class FuelCarFactory implements CarFactory {public Engine createEngine() { return new FuelEngine(); }public AirConditioner createAirConditioner() { return new FuelAirConditioner(); }
}// 使用示例
public class Main {public static void main(String[] args) {CarFactory cf = new ElectricCarFactory();Engine engine = cf.createEngine();AirConditioner ac = cf.createAirConditioner();engine.start();  // 输出: 电动机启动ac.cool();      // 输出: 电子变频空调工作}
}

特点

  • 一个工厂能生产配套的发动机+空调

  • 保证电动车的发动机和空调是电子化的,燃油车的都是机械化的


3、小结

1、简单工厂模式

一个工厂类根据传入的参数决定创建哪种产品类的实例。

2、工厂方法模式

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。

3、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。


参考文章:

1、Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)_简单工厂模式,工厂方法模式,抽象工厂模式-CSDN博客https://blog.csdn.net/a745233700/article/details/120253639?ops_request_misc=%257B%2522request%255Fid%2522%253A%252227ffb8b4a369e0e5024f4e17abda46f3%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=27ffb8b4a369e0e5024f4e17abda46f3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120253639-null-null.142^v102^pc_search_result_base1&utm_term=%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

http://www.dtcms.com/a/334587.html

相关文章:

  • DAY12DAY13-新世纪DL(Deeplearning/深度学习)战士:破(改善神经网络)1
  • 嵌入式硬件篇---常见的单片机型号
  • ​进程与线程(线程)
  • 【JavaEE】多线程 -- 线程等待wait和notify
  • 对话访谈|盘古信息×智晟威:深度挖掘数字化转型的奥秘
  • 【数据结构】深入理解单链表与通讯录项目实现
  • git revert
  • Java Condition 对象 wait 方法使用与修复方案
  • 云计算-Kubernetes+Istio 实现金丝雀发布:流量管理、熔断、流量镜像、ingreess、污点及pv案例实战
  • 如何防止 RabbitMQ 的消息丢失?如何保证消息的可靠传输?
  • Python 项目高频设计模式实战指南:从理念到落地的全景剖析
  • Linux软件编程--线程
  • 蓝牙音频ANC四通道测试解决方案
  • 新经济形态下人才能力结构变革与发展研究报告
  • Win10快速安装.NET3.5
  • RecSys:多目标模型和MMOE
  • .NET8下的Garnet使用
  • androidstudio内存大小配置
  • 研究生第十六周周报
  • 718SJBH公交查询系统
  • 4.6 Vue 3 中的模板引用 (Template Refs)
  • Sklearn 机器学习 邮件文本分类 加载邮件数据
  • [Responsive theme color] 动态主题 | 色彩工具函数 | HEX与RGB
  • 嵌入式第三十天(线程)
  • 围棋对战游戏开发详解 附源码
  • 【C++】标准库中用于组合多个值的数据结构pair、tuple、array...
  • k8s+kubeedge的混合框架下,云端pod与边缘端pod如何进行通信?
  • HTTP协议-1-认识各个HTTP协议版本的主要特点
  • Python进行点云公共区域的提取
  • Docker目录的迁移