【Java 设计模式】创建型之抽象工厂模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 4. 应用示例
    • 结语

在软件开发中,抽象工厂模式是一种常见的创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式的核心思想是将一组相关的产品组合成一个工厂,客户端通过工厂接口创建一系列产品。在本文中,我们将介绍 Java 设计模式中的抽象工厂模式,了解其定义、使用场景以及如何在实际开发中应用。

1. 定义

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式将一组相关的产品组合成一个工厂,客户端通过工厂接口创建一系列产品。这有助于实现产品族的概念,其中产品族是指一组相关的产品,例如不同品牌的汽车。

2. 应用场景

抽象工厂模式的应用场景包括但不限于以下情况:

  • 一系列相关产品:

    当有一系列相关或相互依赖的产品需要创建时,此时就可以使用抽象工厂模式,这有助于确保产品之间的兼容性和一致性

  • 系统扩展性:

    当系统需要支持新的产品族时,只需新增对应的具体工厂类和产品类,而无需修改已有代码

  • 隐藏具体实现:

    客户端只需关心抽象工厂和抽象产品的接口,不需要知道具体实现类,降低了客户端与具体类之间的耦合

3. 代码实现

抽象工厂模式的实现主要涉及以下几个角色:

在这里插入图片描述

  • 抽象产品接口(AbstractProduct): 定义了产品的抽象方法
  • 具体产品实现类(ConcreteProduct): 实现了抽象产品接口,是抽象工厂创建的具体对象
  • 抽象工厂接口(AbstractFactory): 定义了创建产品的抽象方法,可以包含多个不同的抽象产品接口
  • 具体工厂实现类(ConcreteFactory): 实现了抽象工厂接口,负责创建具体产品的对象

下面是一个简单的抽象工厂模式的实现示例:

1)创建一个产品接口 AbstractProductA 及它的两个实现类 ConcreteProductA1 和 ConcreteProductA2

AbstractProductA.java

package com.cheney.demo;

interface AbstractProductA {
    void operationA();
}

ConcreteProductA1.java

package com.cheney.demo;

class ConcreteProductA1 implements AbstractProductA {
    @Override
    public void operationA() {
        System.out.println("产品 A1");
    }
}

ConcreteProductA2.java

package com.cheney.demo;

class ConcreteProductA2 implements AbstractProductA {
    @Override
    public void operationA() {
        System.out.println("产品 A2");
    }
}

2)创建一个产品接口 AbstractProductB 及它的两个实现类 ConcreteProductB1 和 ConcreteProductB2

AbstractProductB.java

package com.cheney.demo;

interface AbstractProductB {
    void operationB();
}

ConcreteProductB1.java

package com.cheney.demo;

class ConcreteProductB1 implements AbstractProductB {
    @Override
    public void operationB() {
        System.out.println("产品 B1");
    }
}

ConcreteProductB2.java

package com.cheney.demo;

class ConcreteProductB2 implements AbstractProductB {
    @Override
    public void operationB() {
        System.out.println("产品 B2");
    }
}

3)创建一个产品接口 AbstractFactory 及它的两个实现类 ConcreteFactory1 和 ConcreteFactory2

AbstractProductB.java

interface AbstractFactory {
    AbstractProductA createProductA();
    AbstractProductB createProductB();
}

ConcreteFactory1.java

package com.cheney.demo;

class ConcreteFactory1 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}

ConcreteFactory2.java

package com.cheney.demo;

class ConcreteFactory2 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

在上述示例中,AbstractProductAAbstractProductB 是抽象产品接口,定义了产品的抽象方法。ConcreteProductA1ConcreteProductA2ConcreteProductB1ConcreteProductB2 是具体产品的实现类。

AbstractFactory 是抽象工厂接口,定义了创建产品的抽象方法。ConcreteFactory1ConcreteFactory2 是具体工厂的实现类,分别负责创建 ConcreteProductA1ConcreteProductA2ConcreteProductB1ConcreteProductB2

4. 应用示例

假设我们要吃可乐喝汉堡,需要支持不同店的美食。我们可以使用抽象工厂模式来管理不同店下的美食。

1)创建一个可乐接口 及它的两个实现类

Cola.java

package com.cheney.demo;

interface Cola {
    void makeCola();
}

KfcCola.java

package com.cheney.demo;

class KfcCola implements Cola {
    @Override
    public void makeCola() {
        System.out.println("肯德基的可乐");
    }
}

McDonaldSCola.java

package com.cheney.demo;

class McDonaldSCola implements Cola {
    @Override
    public void makeCola() {
        System.out.println("麦当劳的可乐");
    }
}

2)创建一个汉堡包接口 及它的两个实现类

Hamburger.java

package com.cheney.demo;

interface Hamburger {
    void makeHamburger();
}

KfcHamburger.java

package com.cheney.demo;

class KfcHamburger implements Hamburger {
    @Override
    public void makeHamburger() {
        System.out.println("肯德基的汉堡包");
    }
}

McDonaldSHamburger.java

package com.cheney.demo;

class McDonaldSHamburger implements Hamburger {
    @Override
    public void makeHamburger() {
        System.out.println("麦当劳的汉堡包");
    }
}

3)创建一个美食工厂接口 及 它的两个实现类

FoodFactory.java

package com.cheney.demo;

interface FoodFactory {
    Cola createCola();
    Hamburger createHamburger();
}

KfcFoodFactory.java

package com.cheney.demo;

class KfcFoodFactory implements FoodFactory {
    @Override
    public Cola createCola() {
        return new KfcCola();
    }

    @Override
    public Hamburger createHamburger() {
        return new KfcHamburger();
    }
}

McDonaldSFoodFactory.java

package com.cheney.demo;

class McDonaldSFoodFactory implements FoodFactory {
    @Override
    public Cola createCola() {
        return new McDonaldSCola();
    }

    @Override
    public Hamburger createHamburger() {
        return new McDonaldSHamburger();
    }
}

在上述示例中,ColaHamburger 是抽象产品接口,定义了产品的抽象方法。KfcColaKfcHamburgerMcDonaldSColaMcDonaldSHamburger 是具体产品的实现类。

FoodFactory 是抽象工厂接口,定义了创建产品的抽象方法。KfcFoodFactoryMcDonaldSFoodFactory 是具体工厂的实现类,分别负责创建KfcColaKfcHamburgerMcDonaldSColaMcDonaldSHamburger

在使用中,我们可以根据需要选择不同的工厂来创建不同店里的美食

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 创建 麦当劳系列 美食
        FoodFactory mcDonaldSFoodFactory = new McDonaldSFoodFactory();
        Cola mcDonaldSCola = mcDonaldSFoodFactory.createCola();
        Hamburger mcDonaldSHamburger = mcDonaldSFoodFactory.createHamburger();
        mcDonaldSCola.makeCola();
        mcDonaldSHamburger.makeHamburger();

        // 创建 肯德基系列 美食
        FoodFactory kfcFoodFactory = new KfcFoodFactory();
        Cola kfcCola = kfcFoodFactory.createCola();
        Hamburger kfcHamburger = kfcFoodFactory.createHamburger();
        kfcCola.makeCola();
        kfcHamburger.makeHamburger();
    }
}

执行结果

在这里插入图片描述

结语

抽象工厂模式是一种常见且实用的设计模式,它通过定义一个工厂接口,将一系列相关或相互依赖的对象的创建延迟到具体工厂的实现类中,从而实现了客户端和具体类的解耦。在实际开发中,抽象工厂模式常用于创建一系列相关的产品,如美食店中的可乐、汉堡包等。通过合理使用抽象工厂模式,可以使系统更容易扩展和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/327806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构 ##关于window mysql主从搭建简单教程 传送门 window mysql5.7 搭建主从同步环境-CSDN博客 ##父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project…

北交所交易手续费标准?哪家证券公司开通北交所券商交易手续费佣金万2?

北交所&#xff08;Beijing Exchange&#xff09;是指位于中国北京的一家金融交易所。北交所是中国政府为推动金融改革和国际化市场而设立的交易场所。它提供包括股票、债券、期货、外汇等多种金融产品的交易服务。北交所的目标是促进中国金融市场的发展&#xff0c;吸引国内外…

机器人持续学习基准LIBERO系列7——计算并可视化点云

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…

git项目管理

Git工作流程图 git 基础指令 git init #创建本地仓库,创建成功后&#xff0c;当前目录会多一个.git文件夹 git status #查看修改状态 git add . #添加工作区到暂存区 git commit -m 注释内容 #提交暂存区到本地仓库&#xff08;commit&#xff09; git log …

PngToIco.java

PngToIco.java [PNG转ICO]为了解决今天项目PNG弄成ICO写的 package image;import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;import javax.imageio.ImageIO;import org.apache.commons.imaging.ImageFormats; import org.apache.common…

Git版本控制——分支

分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着可以把工作从开发主线上分离开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响开发主线。 查看本地分支 git branch创建本地分支 git branch 分支名切换分支(checkout) git checkout 分支名创建…

链表练习 Leetcode234.回文链表

题目传送门&#xff1a;Leetcode234 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&…

x-cmd pkg | mermaid - 流程图、时序图等图表绘制工具

简介 mermaid-cli 是由 Mermaid 官方提供的命令行工具&#xff0c;用于将 Mermaid 语法的文本转换为 SVG / PNG / PDF。 Mermaid 是一个基于 JavaScript 的图表绘制工具&#xff0c;它使用简单的文本描述语法&#xff0c;就可以绘制出流程图、时序图、甘特图等多种图表。 首次…

FFmpeg连载6-音频重采样

今天我们的实战内容是将音频解码成PCM&#xff0c;并将PCM重采样成特定的采样率&#xff0c;然后输出到本地文件进行播放。 什么是重采样&#xff1f; 所谓重采样&#xff0c;一句话总结就是改变音频的三元素&#xff0c;也就是通过重采样改变音频的采样率、采样格式或者声道数…

一文了解ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模应用

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

CentOS 7 权限管理实战指南:用户组管理相关命令详解

前言 深入了解 CentOS 7 用户组管理的命令&#xff0c;掌握关键的用户组操作技巧。从创建和删除用户组、修改组属性&#xff0c;到设置组密码和管理组成员&#xff0c;这篇文章详细介绍了 CentOS 7 系统下常用的用户组管理命令&#xff0c;为读者小伙伴提供了实用而全面的指南…

ASP.NET Core列表增删改查

前置要求&#xff1a; 1. vueelement-plus实现前端静态页面 HelloWorld.vue <template><h2>hello界面</h2><div class"tableList"><!-- 搜索框 --><el-row :gutter"20"><el-col :span"8"><!-- 搜…

Angular系列教程之DOM操作

文章目录 引言1. ElementRef2. Renderer23. ViewChild结论 引言 在Angular中&#xff0c;DOM操作是开发Web应用程序的一个重要方面。通过对DOM进行操作&#xff0c;我们可以动态地修改页面内容、样式和元素行为。本文将详细介绍如何在Angular中进行DOM操作&#xff0c;并提供相…

LTC6820和isoSPI使用

1、MSTR主控/受控 MSTR (引脚 11/ 引脚 12)&#xff1a;串行接口主 / 从选择器输入。MSTR接VCC&#xff0c;则LTC6820为从机&#xff1b;MSTR接GND&#xff0c;则LTC6820为主机 2、SLOW慢速/快速 SLOW (引脚 12/ 引脚 13)&#xff1a;慢速接口选择输入。当时钟频率≤ 200kHz …

Top6 最好的 Android 数据恢复软件免费获取

虽然在智能手机上随身携带您最喜爱的音乐收藏或珍贵的录音很方便&#xff0c;但如果您的设备出现技术问题或您不小心删除了文件&#xff0c;文件也有可能丢失。 不管文件是如何删除或丢失的&#xff0c;丢失那些珍贵的音频文件的痛苦对每个人来说都是一样的。这就是我们创建本…

php反序列化之pop链构造

常见魔术方法的触发 __construct() //创建类对象时调用 __destruct() //对象被销毁时触发 __call() //在对象中调用不可访问的方法时触发 __callStatic() //在静态方式中调用不可访问的方法时触发 __get() //调用类中不存在变量时触发&#xff08;找有连续箭头的…

5 个被低估的开源项目

文章目录 1.集算器 -数据处理2. Firecamp - 邮递员替代方案3.Keploy——后端 测试4. Hanko - 密钥验证5. Zrok - Ngrok 类固醇 长话短说 本文列出了五个不太受欢迎的优秀项目&#xff0c;您应该尝试一下。&#x1f525; 这些工具旨在改进数据处理、API 开发、后端测试、身份验…

【无标题】【第6次修改了可删除可持久保存的前端html备忘录:去掉第2页面可误删除

第6次修改了可删除可持久保存的前端html备忘录:去掉第2页面 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露&#xff0c;给小程序添加一个水印浮层。这样即使被截图或者拍照&#xff0c;也能轻松地确定泄露的源头。效果图如下&#xff1a; 代码…

zookeeper简介

Zookeeper 是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的 Apache 项目。 Zookeeper工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受观察者…