Java设计模式 _创建型模式_工厂模式(普通工厂和抽象工厂)

一、工厂模式

属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

二、代码示例

场景:花店有不同的花,通过工厂模式来获取花。

1、普通工厂模式
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建规范的工厂类,封装创建实体对象的方法,只需要根据提供的基础信息就能区别出需要返回的实体对象。
(3)、创建工厂的示例,使用工厂的创建方法创建需要的对象。

逻辑关系:
在这里插入图片描述

代码示例:

// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {
    // 描述花的信息
    String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {
    @Override
    public String desc() {
        return "玫瑰花";
    }
}
// 实现类2,牡丹花
public class Peony implements Flower {
    @Override
    public String desc() {
        return "牡丹花";
    }
}
// 定义花的创建工厂类
public class FlowerFactory {
	// 根据花的名称返回创建对象
    public Flower createFlower(String message){
        if ("玫瑰".equals(message)){
            return new Rose();
        } else {
            return new Peony();
        }
    }
}
// 测试类
public class ZTest {
    public static void main(String[] args) {
        FlowerFactory flowerFactory = new FlowerFactory();
        Flower flower = flowerFactory.createFlower("玫瑰");
        System.out.println(flower.desc());

        flower = flowerFactory.createFlower("牡丹");
        System.out.println(flower.desc());
    }
}

运行结果:
在这里插入图片描述
由运行结果看到,只要对工厂类提供基础的信息描述文字,就能得到对应的花的实体对象。
总结:
仅定义一个工厂用于创建所有可能的实例,根据描述信息创建对应的实例(相当于知道的花的名称,然后去找花店得到花)。

2、抽象工厂示例
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建抽象的规范工厂(抽象类),定义统一的创建方法(抽象方法)
(3)、创建每一种实体的工厂类,实现规范工厂的抽象方法用来创建对应的实例对象
(4)、定义抽象工厂,不同场景下构建不同的实例工厂来创建对象

逻辑关系:
在这里插入图片描述
代码示例:

// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {
    // 描述花的信息
    String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {
    @Override
    public String desc() {
        return "玫瑰花";
    }
}
// 实现类2,牡丹花
public class Peony implements Flower {
    @Override
    public String desc() {
        return "牡丹花";
    }
}

// 定义抽象工厂和抽象创建方法
public abstract class FlowerFactory {
    abstract Flower createFlower();
}
// 定义玫瑰的实例工厂,实现抽象工厂
public class RoseFactory extends FlowerFactory {
     public Flower createFlower(){
         return new Rose();
     };
}
// 定义牡丹的实例工厂,实现抽象工厂
public class PeonyFactory extends FlowerFactory {
     public Flower createFlower(){
         return new Peony();
     };
}
// 测试方法
public class ZTest {
    public static void main(String[] args) {
        FlowerFactory flowerFactory = new RoseFactory();
        Flower flower = flowerFactory.createFlower();
        System.out.println(flower.desc());

        flowerFactory = new PeonyFactory();
        flower = flowerFactory.createFlower();
        System.out.println(flower.desc());
    }
}

运行结果
在这里插入图片描述
总结:
需要定义一个抽象工厂,和每一种花的实例工厂用于创建自身的实例(相当于知道了花店的地址,这个花店只卖这一种花的情况)。

三、普通工厂和抽象工厂对比

两种方法都实现了封装创建实例的功能。
但是普通工厂模式违反了单一职责的原则(一个类只干一种事情),且随着花的实例品种越来越多,每一次都要修改工厂类才能添加新的花品种,相对而言是改动是比较大的也比较麻烦的。
抽象工厂模式,很好的规避了普通工厂的这两个缺点,新增花的品种,只要添加新的花品种的工厂类即可,但是这种方式会造成有非常多的类需要维护,不方便于代码的管理和维护。
总结来说,工厂模式和抽象工厂模式都有其独特的优点和适用场景。工厂模式适用于创建单个对象的情况,而抽象工厂模式适用于创建一系列相关的产品对象。在选择使用哪种模式时,应根据具体的业务需求和系统架构进行权衡和选择。

学海无涯苦作舟!!!

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

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

相关文章

maven-安装maven

解压 修改配置文件 apache-maven-3.6.1\conf\settings.xml 新建文件夹mvn_repo为仓库 配置镜像 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url><…

手动在Ubuntu22.04上部署LAMP环境

简介 LAMP环境是常用的Web开发环境之一&#xff0c;其中LAMP分别代表Linux、Apache、MySQL和PHP。本文介绍如何在Ubuntu操作系统的ECS实例内部署LAMP环境。 准备工作 该实例必须满足以下条件&#xff1a; 实例已分配公网IP地址或绑定弹性公网IP&#xff08;EIP&#xff09;。…

电脑运行Omniverse卡顿?试试赞奇云工作站

无论是创造能够表达原始情感的逼真数字人&#xff0c;还是构建身临其境的虚拟世界&#xff0c;全球设计、工程、创意和其他行业的人士都在通过3D工作流&#xff0c;突破技术壁垒并拓展创意可能&#xff0c;让虚拟世界和现实世界交融与观众产生共鸣。在众多连接未来创作内容的平…

【Canvas与艺术】 绘制五星红旗

【注意】 该图中五星定位和大小都是按 https://www.douyin.com/note/7149362345016380710 精确绘制的。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8&q…

Spring AOP详解,简单Demo

目录 一、Spring AOP 是什么&#xff1f; 二、学习AOP 有什么作用&#xff1f; 三、AOP 的组成 四、 Spring AOP 简单demo 一、Spring AOP 是什么&#xff1f; Spring AOP&#xff08;Aspect-Oriented Programming in Spring&#xff09;是Spring框架中的一个重要组件&…

python部署linux

项目做完了&#xff0c;就涉及到了部署 部署 Python的打包部署方式有多种&#xff0c;具体取决于项目的需求、规模以及所使用的工具。以下是几种常见的Python打包部署方式&#xff1a; 使用pip安装&#xff1a;对于小型的Python库或工具&#xff0c;通常可以直接通过pip进行安…

《恶意不息》是一款什么样的游戏,苹果电脑怎么玩《恶意不息》恶意不息游戏内怎么存档 mac电脑玩游戏

近日steam游戏商城新上架了一款名叫《恶意不息》的游戏十分火爆&#xff0c;那么《恶意不息》是一款什么样的游戏&#xff0c;苹果电脑怎么玩《恶意不息》&#xff1f;一起来看看吧&#xff01; 一、《恶意不息》是一款什么样的游戏&#xff1f; Private Division&#xff0c;…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

对2023年图灵奖揭晓看法

2023年图灵奖揭晓&#xff0c;你怎么看&#xff1f; 2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。这些贡献不仅推…

chrome 查看版本安装路径、cmd命令行启动浏览器

chrome 查看版本安装路径 浏览器输入 chrome://version/cmd命令行启动浏览器 参考&#xff1a;https://blog.csdn.net/bigcarp/article/details/121426245 "C:\Program Files\Google\Chrome\Application\chrome.exe" www.baidu.com"C:\Program Files\Google…

9种单片机常用的软件架构

长文预警&#xff0c;加代码5000多字&#xff0c;写了4个多小时&#xff0c;盘软件架构&#xff0c;这篇文章就够了! 可能很多工程师&#xff0c;工作了很多年&#xff0c;都不会有软件架构的概念。 因为我在做研发工程师的第6年&#xff0c;才开始意识到这个东西&#xff0c;在…

meterpreter运行run getgui -e报错

meterpreter运行run getgui -e报错 meterpreter > run getgui -e [!] Meterpreter scripts are deprecated. Try post/windows/manage/enable_rdp. [!] Example: run post/windows/manage/enable_rdp OPTIONvalue [...] [-] The specified meterpreter session script cou…

云仓酒庄央视广告战略签约,旗下品牌将迎来全新发展机遇

近日&#xff0c;备受瞩目的云仓酒庄2024-2025年度央视广告战略签约仪式盛大举行&#xff0c;云仓酒庄副总裁周玄代表云仓酒庄签约。云仓酒庄与中视中州&#xff08;央视代理机构&#xff09;成功签约&#xff0c;将在CCTV 2财经、CCTV 15音乐、CCTV 7国防军事、CCTV 4中文国际…

kubernetes共享存储原理

存储原理 1. PersistentVolume (PV)&#xff1a;存储资源的容器2. PersistentVolumeClaim (PVC)&#xff1a;用户的需求清单3. StorageClass&#xff1a;存储服务的菜单A. Container Storage Interface (CSI)小总结PersistentVolume (PV)PersistentVolumeClaim (PVC)静态分配 v…

1.Spring入门-初识Spring核心思想IOC和快速入门

Spring Spring Framework 是一个开源的 Java/Java EE 全功能栈&#xff08;full-stack&#xff09;的应用程序框架&#xff0c;以 Apache 许可证形式发布&#xff0c;也有 .NET 平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development&#xff08;IS…

hive使用hplsql进行etl或其它数据加工

参照 https://cwiki.apache.org/confluence/pages/viewpage.action?pageId59690156 http://www.hplsql.org/doc Hive HPL/SQL&#xff0c;即Hive Hybrid Procedural SQL一个开源工具&#xff0c;它为hive实现了过程性的SQL功能&#xff0c;类似Oracle的PLSQL。从hive 2.0.0开…

Spring中的声明式事务详解

1 事务概述 在JavaEE企业级开发的应用领域&#xff0c;为了保证数据的完整性和一致性&#xff0c;必须引入数据库事务的概念&#xff0c;所以事务管理是企业级应用程序开发中必不可少的技术。 事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作&…

Springboot+Vue项目-基于Java+MySQL的家政服务平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Java中一个汉字究竟占几个字节?

前言 在今天&#xff0c;“Java中一个汉字占几个字符”的问题&#xff0c;让我提起了兴趣 在我的记忆中&#xff0c;一个字符应该是占两个字符的。但看了他人的回答 发现自己对这方面了解非常片面&#xff0c;于是痛定思痛潜心学习&#xff0c;写下这篇博客 总结不足文章目录 …
最新文章