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

news2025/6/21 0:03:12

        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);
        //以下物流运输业务。。。。
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PodMan容器技术

容器 容器技术 软件应用通常依赖于运行时环境提供的系统库、配置文件或服务。传统上,软件应用的运行时环境安装 在物理主机或虚拟机上运行的操作系统中。 然后,管理员在操作系统上安装应用依赖项。 在RHEL中,诸如 RPM 等打包系统可协助管…

Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

写在前面 CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞&#xff0c;fastjson 于 1.2.24 版本后增加了反序列化白名单&#xff1b; 而在 2019 年&#xff0c;fastjson 又被爆出在 fastjson< 1.2.47 的版本中&#xff0c;攻击者可以利用特殊构造的 …

【深度学习】知识点归纳总结-for 面试【自用】

add 和 concat的区别 特征add的时候就是增加特征的信息量&#xff0c;特征concat的时候就是增加特征的数量&#xff0c;注重细节的时候使用add&#xff0c;注重特征数量的时候使用concat&#xff0c; resnet用的add densenet用的concat RNN应用 一、关键字提取&#xff08;…

“比特币深夜冲破7万美元”!华尔街押注比特币:究竟是牛市墙头草,还是加密真信徒?

比特币ETF&#xff0c;使此次加密牛市与以往的繁荣、萧条周期截然不同。以往的周期往往由热衷风险的投机者以及最终崩盘的加密项目所驱动&#xff0c;例如无实物资产支持的加密货币借贷&#xff0c;以及一地鸡毛的ICO热潮。而现在&#xff0c;传统金融已经与加密世界联姻&#…

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

Java - JVM

文章目录 一、JVM1. JVM的作用2. JVM、JRE、JDK的关系3. JVM的组成4. JVM工作流程5. 运行时方法区Runtime Data Area 二、深入JVM内存模型&#xff08;JMM&#xff09; 一、JVM 1. JVM的作用 Java代码编译成java字节码后&#xff0c;运行在JVM中&#xff0c;只要针对不同的系统…

鸿蒙Harmony应用开发—ArkTS声明式开发(触摸交互控制:触摸测试控制)

设置组件的触摸测试类型。ArkUI开发框架在处理触屏事件时&#xff0c;会在触屏事件触发前&#xff0c;进行按压点和组件区域的触摸测试来收集需要响应触屏事件的组件&#xff0c;然后基于触摸测试结果分发相应的触屏事件。hitTestBehavior属性可以设置不同的触摸测试响应模式&a…

20240308-1-校招前端面试常见问题CSS

校招前端面试常见问题【3】——CSS 1、盒模型 Q&#xff1a;请简述一下 CSS 盒模型&#xff1f; W3C 模式&#xff1a;盒子宽widthpaddingbordermargin 怪异模式&#xff1a;盒子宽widthmargin Q&#xff1a;inline、block、inline-block 元素的区别&#xff1f; inline&am…

0环PEB断链实现

截止到昨天那里我们的思路就清晰了&#xff0c;通过EPROCESS找到我们要隐藏的进程的ActiveProcessLinks&#xff0c;将双向链表的值修改&#xff0c;就可以将我们想要隐藏的这个进程的ActiveProcessLinks从双向链表中抹去的效果&#xff0c;这里的话如果在windbg里面直接使用ed…

[笔记]Crash Course Computer Science

文章目录 二进制算术逻辑单元 ALU算术单元逻辑单元 寄存器&内存CPU 中央处理器指令CPU结构运行命令时钟 高级CPU设计集成电路电子管晶体管集成电路印刷电路板 PCB Printed Circuit Board光刻摩尔定律 二进制 byte 在电脑中的单位换算&#xff1a; kilobyte 千字节 megaby…

【C++】手把手教你模拟实现 vector

目录 一、构造/析构/拷贝 1、构造函数 1️⃣无参的构造函数 2️⃣带参的构造函数 3️⃣类模板的构造函数 2、析构函数 3、拷贝构造 二、修改操作 1、reserve 【错误版本】 &#x1f31f;【解答】正确版本 2、resize 3、push_back 4、pop_back 5、insert 6、era…

【LV15 DAY7 阻塞和非阻塞】

一、五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉非阻塞&#xff1a;不能操作就返回错误 多路复用&#xff1a;委托中介监控信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作异步IO&#xff1a;向内核注册操作请求&#xff0c;内核…

Web本体语言OWL

语义网&#xff08;Semantic Web&#xff09;&#xff1a; 语义网是万维网联盟&#xff08;W3C&#xff09;提出的一种愿景&#xff0c;旨在增强现有Web的表达能力和智能处理能力&#xff0c;通过标准化的技术手段赋予网络数据更加精确和可计算的语义&#xff0c;使得机器能够…

Ubuntu18/20运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18/20) 文章目录 ORB-SLAM3复现(ubuntu18/20)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calib…

【Appium问题】每次启动appium都会安装一次uiautomator

问题 每次启动appium&#xff0c;都需要安装一次uiautomator2比较麻烦 解决 在配置文件capabilities 中增加参数skipServerInstallationTrue

CSDN,最全API接口测试入门教程到实战

由于自己想学习API方面的测试&#xff0c;但是市面上搜不到相关的图书可以系统学习&#xff0c;网上的内容又零零散散&#xff0c;适合有点API开发基础的人去搜索。为了方面新手学习API测试&#xff0c;现在整理了他人的宝贵经验和自己的学习心得&#xff0c;尽量在一篇文章中囊…

git删除comimit提交的记录

文章目录 本地的删除远程同步修改上次提交更多详情阅读 本地的删除 例如我的提交历史如下 commit 58211e7a5da5e74171e90d8b90b2f00881a48d3a Author: test <test36nu.com> Date: Fri Sep 22 20:55:38 2017 0800add d.txtcommit 0fb295fe0e0276f0c81df61c4fd853b7a00…

【开源】JAVA+Vue.js实现食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

水果音乐编曲软件 FL Studio v21.2.3.4004 中文免费版(附中文设置教程)以及新功能介绍

FL studio21中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xff0c;您的工作会变得…

Linux编程3.6 进程-其他进程及函数

1、僵尸进程 子进程结束但是没有完全释放内存&#xff08;在内核中的task_struct没有释放&#xff09;&#xff0c;该进程就成为僵尸进程。当僵尸进程的父进程结束后就会被init进程领养&#xff0c;最终被回收。避免僵尸进程 让僵尸进程的父进程来回收&#xff0c;父进程每隔一…