设计模式(十):抽象工厂模式(创建型模式)

        Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对
象的接口,而无须指定它们的具体类。

       之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。

       简单工厂模式其实不符合开闭原则,即对修改关闭,扩展开放。简单工厂每次需要新增新的产品就需要修改工厂类。而工厂方法模式,每个工厂只负责创建单一的产品,相当于真实工厂里面的一条流水线,如果一个工厂自身能创建多个产品呢?那就需要抽象工厂了。

      三种工厂模式的区别:

      简单工厂模式:一个抽象产品类(或接口),可以派生出多个具体产品类。 
                               只有一个静态工厂,负责创建多个具体产品类的实例。
      工厂方法模式:一个抽象产品类(或接口),可以派生出多个具体产品类。   
                               一个抽象工厂类(或接口),可以派生出多个具体工厂类。   
                               每个具体工厂类只能创建一个具体产品类的实例。  
      抽象工厂模式:多个抽象产品类(或接口),可以派生出多个具体产品类。   
                               一个抽象工厂类(或接口),可以派生出多个具体工厂类。   
                               每个具体工厂类可以创建多个具体产品类的实例。   
   
区别:工厂方法模式只有一个抽象产品类(或接口),而抽象工厂模式有多个。   
      工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


“抽象工厂”就像真的工厂,“工厂方法”就像工厂中的一条生产线。

抽象工厂模式Demo:

先看类图:

工程结构:

上代码:

package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:Fruit
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:水果接口
 * @Date:2024/3/8 10:25
 * @Author:figo
 */
public interface Fruit {
    //采摘
    void pick();
}

package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:Apple
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:苹果产品
 * @Date:2024/3/8 10:32
 * @Author:figo
 */
public class Apple implements Fruit{

    @Override
    public void pick() {
        System.out.println("采摘苹果");
    }
}

package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:Banana
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:香蕉产品
 * @Date:2024/3/8 10:35
 * @Author:figo
 */
public class Banana implements Fruit{

    @Override
    public void pick() {
        System.out.println("采摘香蕉");
    }
}


package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:Bag
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:包装盒接口
 * @Date:2024/3/8 10:36
 * @Author:figo
 */
public interface Bag {
    //打包
    void pack(Fruit fruit);
}


package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:AppleBag
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:苹果包装盒
 * @Date:2024/3/8 10:37
 * @Author:figo
 */
public class AppleBag implements Bag{
    @Override
    public void pack(Fruit fruit) {
        System.out.println("苹果盒打包苹果");
    }
}



package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:BananaBag
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:香蕉包装盒
 * @Date:2024/3/8 10:37
 * @Author:figo
 */
public class BananaBag implements Bag{

    @Override
    public void pack(Fruit fruit) {
        System.out.println("香蕉盒打包苹果");

    }
}


package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:AbstractFactory
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:抽象工厂,能生产多种产品,比工厂方法模式只能生产单一产品更强
 * @Date:2024/3/8 10:42
 * @Author:figo
 */
public abstract class AbstractFactory {
    public abstract  Fruit getFruit();
    public abstract Bag getBag();
}

package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:AppleFactory
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:苹果工厂能生产苹果和苹果包装盒
 * @Date:2024/3/8 10:46
 * @Author:figo
 */
public class AppleFactory extends AbstractFactory{
    @Override
    public Fruit getFruit() {
        return new Apple();
    }

    @Override
    public Bag getBag() {
        return new AppleBag();
    }
}



package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:BananaFactory
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:香蕉工厂,能生产香蕉也能生产香蕉包装盒
 * @Date:2024/3/8 10:49
 * @Author:figo
 */
public class BananaFactory extends AbstractFactory{
    @Override
    public Fruit getFruit() {
        return new Banana();
    }

    @Override
    public Bag getBag() {
        return new BananaBag();
    }
}


package com.figo.study2024.pattern.abstractfactory;

/**
 * @ClassName:FruitGardenClient
 * @PackageName:com.figo.study2024.pattern.abstractfactory
 * @Description:水果园客户端,测试抽象工厂模式
 * @Date:2024/3/8 10:51
 * @Author:figo
 */
public class FruitGardenClient {
    public static void main(String[] args) {
        fruitOrder();
    }

    /**
     * 水果订单
     */
    public static void fruitOrder()
    {
        //初始化工厂
        AbstractFactory factory = new AppleFactory();//spring使用注入方式,这里测试苹果工厂
        //苹果工厂能生产苹果
        Fruit fruit = factory.getFruit();
        fruit.pick();
        //苹果工厂也能生产包装盒
        Bag bag = factory.getBag();
        bag.pack(fruit);
        //以下物流运输业务。。。。
    }
}

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

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

相关文章

Linux:kubernetes(k8s)允许在任意节点使用kubectl命令(5)

我们部署好了主节点以后,我们使用kubectl命令 一切正常,而我们到了别的node上使用 就显示一个这个 这个原因是因为我们开始就配置了master的一个配置文件,在/root/.kube/config 里,而我们的从节点不知道去找那个api接口所以就报…

一分钟安装使用教程,无需服务器,一台电脑就可使用!全网最快速便捷使用Claude 3方法!

随着AI的应用变广,各类AI程序已逐渐普及,尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景,大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

【mogoose】对查询的数据进行过滤不需要展示的信息

数据库结构如下 我只要email userName sex role 几个数据,其余不要 {_id: new ObjectId(65e7b6df8d06a0623fa899f5),email: 12345qq.com,pwd: $2a$10$eLJ9skKEsQxvzHf5X8hbaOXKtg8GCHBeieieSN6Usu17D2DPaI44i,userName: 默认昵称0769,sex: 0,token: {upCount: 0,_…

想交易盈利?Anzo Capital昂首资本发现了一本畅销书

要想在复杂多变的外汇市场中迅速加深了解并想通过交易每天都可以盈利,是通过每天阅读大量的书籍吗?是每天成为行业培训网络资源和论坛的常客吗?是通过花钱请有经验的交易者进行个人培训吗?还是进行EA交易呢? 都不是&a…

C# LINQ基础

LINQ基础 1. 入门2. 运算符流语法2.1 连续使用查询运算符2.2 使用Lambda表达式2.2.1 Lambda表达式及Func的方法签名2.2.2 Lambda表达式和元素类型2.2.3 自然排序2.2.4 其他查询运算符 3 查询表达式4 延迟执行4.1 重复执行4.2 捕获的变量4.3 延迟加载的工作原理4.4 查询语句的执…

如何将TIDB作为Mysql的从库实现实时数据同步

------------------------------------------------------------------- 欢迎关注作者 墨天伦:潇湘秦的个人主页 - 墨天轮 CSDN:潇湘秦-CSDN博客 公众号:潇湘秦的DBA之路 ------------------------------------------------------------------- 近期一个MES项目架构比较复…

Spark实战-基于Spark日志清洗与数据统计以及Zeppelin使用

Saprk-日志实战 一、用户行为日志 1.概念 用户每次访问网站时所有的行为日志(访问、浏览、搜索、点击)用户行为轨迹,流量日志2.原因 分析日志:网站页面访问量网站的粘性推荐3.生产渠道 (1)Nginx(2)Ajax4.日志内容 日志数据内容:1.访问的…

IOS降级后从高版本到低版本恢复备份

IOS降级后从高版本到低版本恢复备份 此方法只适用于小版本还原,比如17.4->17.3,未验证大版本恢复可行性手机型号:iphone 13pro 系统版本:17.4 降级版本:17.3.1 步骤 通过itunes或者MacOS系统下对当前版本进行备份…

Windows11安装FFmpeg最新版本

打开终端: 输入 winget install ffmpeg 然后输入 Y 回车后出现如下图: 正在下载FFmpeg 6.1 安装成功 测试

常见数据类型

目录 数据类型 字符串 char nchar varchar varchar2 nvarchar 数字 number integer binary_float binary_double float 日期 date timestamp 大文本数据 大对象数据 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 数…

Python实现时间序列分析Theta模型(ThetaModel算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中的Theta模型(Theta Model)是由Athanasios Theodoridis在2008年提出的一种统计预测方法&…

Java中SpringBoot四大核心组件是什么

一、Spring Boot Starter 1.1 Starter的应用示例 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency><groupId>org.mybatis.sprin…

代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

递归法&#xff0c;考虑当我站在一个节点上时&#xff0c;我应该干点啥&#xff0c;是不是想知道是否是平衡二叉树&#xff0c;就得知道左右子树的高度&#xff0c;进一步判断这个节点下是不是平衡的&#xff0c;天然的就是一个后序遍历的场景&#xff0c;从左右子树收集信息 …

《JAVA与模式》之观察者模式

系列文章目录 文章目录 系列文章目录前言一、观察者模式的结构二、推模型和拉模型三、JAVA提供的对观察者模式的支持四、怎样使用JAVA对观察者模式的支持前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

推荐两本C语言学习的书籍

提高学生应对未来专业实践课程的兴趣和信心。 C程序设计 | 谭浩强 由谭浩强教授著、清华大学出版社出版的《C程序设计》经过近三十年一千多万读者的实践检验&#xff0c;被公认为学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要&#xff0c;作者在《C程序设计…

AtCoder Beginner Contest 343(A,B,C,D,E,F)

比赛链接 CE是暴力&#xff0c;D是数据结构题&#xff0c;F是线段树。这场的E比较有意思&#xff0c;其他的感觉有点水。 A - Wrong Answer 题意&#xff1a; 给你两个数 A , B A,B A,B ( 0 ≤ A , B ≤ 9 ) (0\le A,B\le 9) (0≤A,B≤9)&#xff0c;返回一个个位数&#…

嵌入式学习day34 网络

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次…

vis.js network操作学习

前言 网络是显示网络以及由节点和边组成的网络的可视化。可视化易于使用&#xff0c;并支持自定义形状、样式、颜色、尺寸、图像等。网络可视化可以在任何现代浏览器上顺利运行&#xff0c;最多可显示数千个节点和边缘。为了处理大量节点&#xff0c;网络提供了集群支持。Netw…

南京观海微电子---PCIe协议(一)

概述 PCIe协议是一种端对端的互连协议&#xff0c;提供了高速传输带宽的解决方案。与传统的并行总线标准如PCI和PCI-X相比&#xff0c;PCIe提供了更低的延迟和更高的数据传输速率。每个连接到主板上的设备都通过独立的点对点连接与之相连&#xff0c;这避免了设备之间因为共享…

四信全球化拓展再启新篇!LoRa传感器与云平台领航智能感知时代

随着科技浪潮的不断推进&#xff0c;物联网已逐渐融入我们的生活。刚刚结束的MWC24盛会上&#xff0c;四信带来了一系列前沿技术成果&#xff0c;不仅将5G技术成功扩展至当前市场主流类型的终端&#xff0c;更携手联通、ASR等业界巨头&#xff0c;在连接、5G RedCap、AI、LoRa以…