设计模式-工厂模式(Java)

news2024/11/29 16:30:13

工厂方法模式

工厂方法模式:Factory Method

事物是发展的,随着事物的不断发展,原有的对象会随着发展不断变化,或增或减。
工厂方法模式提供的一种封装机制,隔离出了那些易变动的对象。这个时候需求的变动不再影响之前的对象的变动了。

一、工厂方法模式角色

  • 1、抽象产品:所有子类产品的基类,给出一个抽象接口或抽象类。
  • 2、具体产品:继承抽象产品的属性、方法,具有某种特质的具体产品。
  • 3、抽象工厂:包含产品的核心业务逻辑,给出一个抽象接口或抽象类。
  • 4、具体工厂:继承抽象工厂的具体工厂,实现具体业务逻辑。

二、工厂方法使用场景

1、无法预知对象确切类别及其依赖关系时。
2、为了能够扩展代码中的组件时。
3、复用现有对象节省系统资源时。

三、工厂方法案例及代码实现

华为是一家集团,包含有手机、网络、手表、路由、汽车等等产业。在一开始的华为并没有汽车业务,它的起家是从网络交换机开始的。那么当我们在代码中定义华为时,是无法预知它未来的业务及其依赖关系的,此时就适用于工厂方法模式。

对应的工厂方法模式角色如下:
1、抽象产品:华为产品
2、具体产品:华为手表、华为汽车、华为路由
3、抽象工厂:华为工厂
4、具体工厂:华为手机工厂、华为汽车工厂、华为路由工厂

3.1 工厂方法代码实现

1、示例图/UML图

工厂方法示例图

在这里插入图片描述

2、抽象产品

定义一个产品接口,为所有产品的父类:HuaWeiProduct.java,其定义了常量:MANUFACTURER(制造商)=HuaWei;抽象接口:getManufacturer()获取制造商;getProductName()获取具体产品名称

public interface  HuaWeiProduct {
    /**
     * 华为产品制造商必定都是华为
     **/
     String MANUFACTURER = "HuaWei";

    /**
     * 通过产品可以获取制造商
     **/
    String getManufacturer();

    /**
     * 通过产品可以获取产品名称
     **/
    String getProductName();
}

3、具体产品

1、手机产品

华为产品的子类,实现抽象产品的抽象接口:HuaWeiPhone.java

public class HuaWeiPhone implements HuaWeiProduct {
    @Override
    public String getManufacturer() {
        return HuaWeiProduct.MANUFACTURER;
    }

    @Override
    public String getProductName() {
        return "华为手机";
    }
}

手机在未来阶段会有多种类型,这里建立Mate产品和Nova产品,继承手机产品类,重写getProductName()方法。

public class HuaWeiMatePhone extends HuaWeiPhone{
    @Override
    public String getProductName() {
        return super.getProductName() + ":Mate系列手机";
    }
}

public class HuaWeiNovaPhone extends HuaWeiPhone{
    @Override
    public String getProductName() {
        return super.getProductName() + ":Nova系列手机";
    }
}

2、汽车产品

华为产品的子类,实现抽象产品的抽象接口:HuaWeiCar.java

public class HuaWeiCar implements HuaWeiProduct {
    @Override
    public String getManufacturer() {
        return HuaWeiProduct.MANUFACTURER;
    }

    @Override
    public String getProductName() {
        return "华为汽车";
    }
}

汽车在未来阶段会有多种类型,目前只有“问界”,继承汽车产品类,重写getProductName()方法。

public class HuaWeiWenJieCar extends HuaWeiCar{

    @Override
    public String getProductName() {
        return super.getProductName() + ":问界汽车";
    }
}

4、抽象工厂

定义一个工厂接口,工厂存在的意义:生产。HuaWeiFactory.java,抽象接口:produce()生产产品

public interface HuaWeiFactory<T> {
    /**
     * 生产方法
     **/
    T produce(Class<? extends T> classz);
}

5、具体工厂

1、手机工厂

实现抽象工厂的方法,是实际创建产品的地方,含有具体创建产品的业务逻辑。这里实现了抽象工厂的produce()方法,通过反射创建对象。

public class HuaWeiPhoneFactory implements HuaWeiFactory<HuaWeiPhone> {
    /**
     * 华为手机工厂生产手机
     **/
    @Override
    public HuaWeiPhone produce(Class<? extends HuaWeiPhone> classz) {
        try {
            return classz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

2、汽车工厂

实现抽象工厂的方法,是实际创建产品的地方,含有具体创建产品的业务逻辑。这里实现了抽象工厂的produce()方法,通过反射创建对象。

public class HuaWeiCarFactory implements HuaWeiFactory<HuaWeiCar> {
    /**
     * 华为汽车工厂生产汽车
     **/
    @Override
    public HuaWeiCar produce(Class<? extends HuaWeiCar> classz) {
        try {
            return classz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

6、通过工厂创建对象

1、实例化手机、汽车工厂:HuaWeiPhoneFactoryHuaWeiCarFactory
2、通过工厂的produce()方法,传入具体需要创建的产品。
3、输出具体产品的制造商与产品名称。

public static void main(String[] args) {
    //华为手机工厂
    HuaWeiFactory<HuaWeiPhone> huaWeiPhoneFactory = new HuaWeiPhoneFactory();
    //华为汽车工厂
    HuaWeiFactory<HuaWeiCar> huaWeiCarFactory = new HuaWeiCarFactory();
    
    HuaWeiProduct huaWeiMateProduct = huaWeiPhoneFactory.produce(HuaWeiMatePhone.class);
    HuaWeiProduct huaWeiNovaProduct = huaWeiPhoneFactory.produce(HuaWeiNovaPhone.class);
    HuaWeiProduct huaWeiWenJieProduct = huaWeiCarFactory.produce(HuaWeiWenJieCar.class);

    System.out.println(huaWeiMateProduct.getManufacturer()+huaWeiMateProduct.getProductName());
    System.out.println(huaWeiNovaProduct.getManufacturer()+huaWeiNovaProduct.getProductName());
    System.out.println(huaWeiWenJieProduct.getManufacturer()+huaWeiWenJieProduct.getProductName());
}

结果如下:

HuaWei华为手机:Mate系列手机
HuaWei华为手机:Nova系列手机
HuaWei华为汽车:问界汽车

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

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

相关文章

Mybatis-Plus中的条件查询-DQL编程

条件构造器 | MyBatis-Plus 当需要进行一些复杂的条件查询时&#xff0c;则需使用wrapper&#xff0c;来编辑这些条件 1、条件查询 ①allEq() 即是where后面的等于"",该方法的后的所有参数都会被以"and"的形式进行连接 QueryWrapper qw1 new QueryWra…

Go语言设计与实现 -- 栈空间管理

寄存器 图片来自于面向信仰编程 Go 语言的汇编代码包含 BP 和 SP 两个栈寄存器&#xff0c;它们分别存储了栈的基址指针和栈顶的地址&#xff0c;栈内存与函数调用的关系非常紧密&#xff0c;我们在函数调用一节中曾经介绍过栈区&#xff0c;BP 和 SP 之间的内存就是当前函数的…

数智化转型进入“精装时代”,容联云助力千行百业加速上云用数赋智

随着产业数字化向前推进&#xff0c;企业引入数字技术的需求和热情十分充足&#xff0c;但要把技术下沉到市场中&#xff0c;还存在一个关键的矛盾&#xff1a;交付能力。千行百业&#xff0c;尤其是传统实体经济从业者&#xff0c;对数智化所需要的5G、IOT、AI、大数据、云计算…

canvas入门教学(5)运动小球屏保特效与下雪特效渲染

本节我们来学习两个例子,第一个例子是如下图这样的,全屏各色各样的小球随机运动,碰撞到屏幕边缘再反弹回来的特效,我们一步一步带着大家来学习这个canvas应用。 首先呢,基于上一个教程的例子,我们需要基础的构建圆, 上节教程在这里 并且呢我们要重复的多次的构建半径…

OVN实验----L2互通

概述 尽量少贴概念&#xff0c;只同步一些必要的名词。 central: 可以看做中心节点&#xff0c;central节点组件包括OVN/CMS plugin、OVN Northbound DB、ovn-northd、OVN Southbound DB。 hypervisor: 可以看做工作节点&#xff0c;hypervisor节点组件包括ovn-controller、ov…

Target 塔吉特的4种商品编码

Target塔吉特共有4种商品编码&#xff1a;TCIN、DPCI、UPC、SKU&#xff0c;其中DPCI、UPC和TCIN在Target系统中是唯一的ID。在target.com中查看商品时&#xff0c;在任一个商品中下拉进入到商品详情页&#xff08;Item/Detail/Specifications&#xff09;中都可以看到该商品的…

13_5、Java的IO流之转换流的使用

一、转换流涉及到的类&#xff1a;都是字符流InputStreamReader&#xff1a;将输入的字节流转换为输入的字符流。解码&#xff1a;字节、字节数组 ————>字符串、字符数组OutputStreamWrite&#xff1a;将输出的字符流转换为输出的字节流。编码&#xff1a;字符串、字符数…

Linux 网络探测和安全审核工具 nmap 应用实践

对于 nmap&#xff0c;相信很多安全运维人员并不陌生&#xff0c;它曾经在电影《黑客帝国》中出现过&#xff0c; 是黑客和网络安全人员经常用到的工具&#xff0c;本文重点介绍下此工具的实现原理和使用技巧。 nmap 和 Zenmap 简介 nmap 是一款开源免费的网络发现工具&#…

2023兔年大吉HTML,兔兔动态代码「兔了个兔」

文章目录一.2023兔年大吉HTML&#xff0c;兔兔动态代码「兔了个兔」1.1 资源获取和效果预览二.代码讲解&#xff08;主要代码&#xff09;1.1 背景加圆圈圈1.2.兔兔和提示字1.3 JavaScript控制动态一.2023兔年大吉HTML&#xff0c;兔兔动态代码「兔了个兔」 1.1 资源获取和效果…

如何在游戏中实现飘花和落叶效果

本文首发于微信公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。今天这篇文章分享一下如何在游戏中实现飘花和落叶的效果&#xff0c;在游戏背景中加入它们&…

FPGA:数字电路简介

文章目录数字电路的历史电子管时代晶体管时代半导体集成电路IC 时代IC的发展阶段EDA (Electronics Design Automation) 技术数字集成电路的分类数字集成电路的集成度分类从器件导电类型不同从器件类型不同数字电路的历史 数字电路是数字计算机和自动控制系统的基础&#xff0c…

[JavaEE初阶] 线程安全问题之内存可见性问题----volatile

读书要趁黑发早,白首不悔少当时 文章目录1. 什么是内存可见性问题2. 避免内存可见性问题-----volatile(易变的)3. 需要注意的点总结1. 什么是内存可见性问题 在线程A在读一个变量的时候,另一个线程B在修改这个变量,所以,线程A读到的值不是修改之后的,是一个未更新的值,读到的值…

先行“蜀道”, 四川农信核心系统分布式转型

作者&#xff1a;四川省农村信用社联合社 张朝辉 桂俊鸿 来源:《金融电子化》 随着四川省联社党委提出“合规银行、智慧银行、主力军银行”三大银行战略。作为四川省业务规模最大的银行业金融机构、全国农信系统“排头兵”的四川农信积极响应&#xff0c;率先于 2018 年 9 月完…

mysql磁盘io

1、磁盘的一些概念 1.1、盘片、片面 和 磁头 硬盘中一般会有多个盘片组成&#xff0c;每个盘片包含两个面&#xff0c;每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制&#xff0c;盘片数量都受到限制&#xff0c;一般都在5片以内。盘片的编号自下向上从…

Viper渗透框架

文章目录Viper 简介Viper 安装脚本安装手动安装切换到 root 用户执行命令Kali 安装 docker (我已经安装过了&#xff0c;不做演示&#xff0c;命令依次执行即可)安装 docker-compose设置安装目录生成安装目录&#xff0c;并进入安装目录生成 docker-compose.yml设置登录密码写入…

【C++常用算法】STL基础语法学习 | 拷贝算法替换算法

目录 ●copy ●replace ●replace_if ●swap ●copy 1.功能描述&#xff1a; 将容器内指定范围的元素拷贝到另一容器中 2.查看copy定义下底层代码的函数原型&#xff1a; 3.向deque容器中插入10~50五个数&#xff0c;将这五个数拷贝到另一个指定容器中并输出。 #include&…

【生产问题】前端接口请求报blocked:mixed-content

事故现象 客户端反馈系统无法使用。打开页面很多内容无法显示。 f12 显示很多请求都失败了。 定位问题 客户咨询 客户反馈昨天 在nginx 上面配置了https证书。导致了http 请求无法访问。 客户已经在nginx上面配置了https。即 网页端的请求会重定向到https请求上面。那为啥…

无需离开 Visual Studio 即可编写 Markdown

当您想要格式化代码但又不想牺牲易读性时&#xff0c;Markdown 是一个很好的解决方案。GitHub 将其用于自述文件&#xff0c;我们将其用作 Visual Studio 文档的标准。之前收到了不少来自开发者的反馈&#xff0c;大家希望在 Visual Studio 中使用 Markdown 编辑器。在最近的 V…

87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)

题目描述 原题链接&#xff1a;347. 前 K 个高频元素 一、优先队列&#xff08;小根堆&#xff09;Hash表 使用Hash表存nums中各元素出现次数&#xff0c;维护一个优先级队列&#xff0c;在里面存k个数&#xff0c;采用小根堆方式&#xff0c;从小到大进行排列。当存入的数多…

Vue3——第五章(响应式 API:isRef、unref、toRef、toRefs等工具函数)

一、isRef() 检查某个值是否为 ref。请注意&#xff0c;返回值是一个类型判定 (type predicate)&#xff0c;这意味着 isRef 可以被用作类型守卫 二、unref() 如果参数是 ref&#xff0c;则返回内部值&#xff0c;否则返回参数本身。这是 val isRef(val) ? val.value : v…