设计模式概述之工厂方法模式(二)

news2024/11/30 10:31:54

很多小伙伴,不知道设计模式是什么?

通常我们所说的设计模式是一种设计方案,是前人留下的经验及最佳实践。

想要学习设计模式,至少要把面向对象的基本结构全部了解。

设计模式,是建立在一定基础上的思维训练。

学习设计模式,要有面临痛苦的决心。

学会设计模式,对解决问题及对程序理解有更高层次的认识。

如果有这样的决心,那么下面我们就认识一下,它的真面目。


常说的设计模式是23种设计模式,分为3大类:

创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型

结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合

行为型模式11种:模板方法、解释器、策略、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者。

当然有一部分模式中,还有一些小的变化,在未来的持续更新中,我们会一一列举,并以代码为主,去学习设计模式。


从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是进行抽象归纳的一个很好的速成思路。

从技术的角度已经有很多好的总结,本文会换一种角度思考,既然设计模式研究的是类与类的关系,我们作为工作的个体,一些工作中的策略是不是也可以进行类比,可以更好地去思考这些模式?答案是肯定的。


上次咱们说了“简单工厂模式”,今天咱们给大家说说创建型模式的“工厂方法模式”。

工厂模式的核心思想就是把创建对象和使用对象解藕,由工厂负责对象的创建,而用户只能通过接口来使用对象,这样就可以灵活应对变化的业务需求,方便代码管理、避免代码重复。

工厂方法模式指定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,让类的实例化延迟到子类中进行。

对比于简单工厂模式,在简单工厂模式中,依赖于唯一的工厂对象,如果需要实例化一个产品时,就要向工厂中传入一个参数获取对象,如果要增加一种产品时,就要在工厂中修改创建产品的函数,耦合性过高。

在工厂方法中,依赖于工厂接口,可以通过实现工厂接口,创建多种工厂,将工厂对象负责具体类的实例化变成由一群子类来负责对具体类的实例化,从而将过程解耦。

既然是工厂,那就必须有产品,咱们的产品,任然用“女娲造人”传说中的人,作为产品。

产品:女娲造人,分男人和女人。

//产品类 人
abstract class  Person{
    private final String name;
    private String sex;
    public Person (String name){
        this.name=name;
    }
    public String toString() {
        return "我的名字是"+this.name+" i am "+sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
//男人
class Man extends Person{
    {
        setSex("Man");
    }
    public Man(String name){
        super(name);
    }
}
//女人
class Women extends  Person{
    {
        setSex("Women");
    }
    public Women(String name){
        super(name);
    }
}

 工厂方法模式,在于工厂的造人方法,造的都是人,需要设计抽象方法,但是具体实现类分了具体是造男人还是造女人。也就是,要达到使用同样的行为,执行同样的指令,造出不同的人。所以这种模式实际上是灵活应用了多态的设计,而完成的此效果。

//工厂方法
interface FactoryMethod{
        Person getObject(String name);
}
class FactoryMan implements FactoryMethod {
        @Override
        public Man getObject(String name) {
                return new Man(name);
        }
}
class FactoryWomen implements FactoryMethod{
        @Override
        public Women getObject(String name) {
                return new Women(name);
        }
}

所以,调用的时候,工厂方法模式发挥着多态的作用:

new FactoryMan().getObject("迪卡");
new FactoryWomen().getObject("萨瓦");

工厂方法模式符合开闭原则和单一职责原则,工厂类支持拓展并且专注于某一类对象的创建工作;日常开发时,稍加留意一下,就会发现在很多工具类设计中都能看到工厂方法的身影。理解工厂方法的优缺点,对我们阅读源码还有开发业务都有很大的帮助。


以上就是今天的分享,如果你感兴趣记得点赞评论哦,以防找不到我。 

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

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

相关文章

volatile,wait,notify关键字

文章目录一、volatile关键字二、wait 和 notifywaitnotifynotifyAllwait 和 sleep 的区别顺序打印ABC一、volatile关键字 volatile关键字的存在是用来解决内存可见性问题的。 我在 :线程安全问题 这篇文章中介绍过内存可见性问题。 前面我们讨论内存可见性时说了,…

教程十 在Go中使用Energy创建跨平台GUI应用 - 事件通信(IPC) 之 Go定义事件JS调用

介绍 Energy Go和JS的事件通信, Go监听事件JS触发。 IPC事件还有其它的几种使用方式,在其它教程中更新 在正常前后端大多数开发场景,JS和Go前后端数据交互都需要Http接口方式交互。 Energy中可以不使用Http,使用事件通信机制(…

使用ProGuard插件对Spring Boot程序进行代码混淆

使用ProGuard插件对Spring Boot程序进行代码混淆 介绍: ​ ProGuard是一个开源的Java类文件(只能处理Java代码,但是对应资源文件等是不能起作用的)的压缩器、优化器、混淆器和预校验器。其处理的过程主要分为以下几个步骤&#…

系统移植总结

1:什么是系统移植 1)系统移植是给开发板搭建一个Linux操作系统 2)从官方获取源码,进行配置和编译,生成板子需要的镜像 2:安装tftp服务器的作用 Tftp服务器:是基于UDP协议完成简单的文件传输 作…

mysql sql优化(索引优化)经验漫谈

文章目录1. 当用sql查找是否“存在”场景2. where 条件 in的限制3. updade语句要不要考虑索引的命中情况4. mysql 预编译 多线程5. 函数与索引失效的关系6. mysql隐性类型转换与索引失效的关系7. 联合索引8. 联合索引最左匹配原则9. 回表 索引覆盖 聚簇索引 非聚簇索引10. 前缀…

这下真的是阳了个阳!

实际情况 很不幸,在前天,出现了新冠阳性的症状,随后用抗原检测了下,有阳的条带出现(很浅,弱阳,因为才出现症状),基本上就是确定阳了。 抗原检测不知道今天是第几天了&…

第40篇 网络(十)WebKit初识

导语 WebKit是一个开源的浏览器引擎。Qt中提供了基于WebKit的QtWebKit模块,它包含了一组相关的类。QtWebKit提供了一个Web浏览器引擎,使用它便可以很容易的将万维网(WorldWide Web)中的内容嵌入到Qt应用程序中。与此同时&#xf…

大二Web课程设计——基于HTML+CSS+JavaScript+jquery手表商城购物网站(17页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

无人机集群的分布式协作 VI-SLAM

以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# D2SLAM: Decentralized and Distributed Collaborative Visual-inertial SLAM System for Aerial Swarm 论文地址:https://arxiv.org/abs/2211.01538…

视频怎么转文字?快把这些方法收好

如今短视频让知识传播变得越来越简单,我们可以很轻松的就通过短视频了解到大量的知识要点。但是当我们想要回温知识点的时候,需要重新观看视频,这就有些不太便利。其实我们可以通过将视频转成文字,这样子就容易归纳知识点了。那你…

Jlink commander使用方法(附指令大全)

Jlinkcmd它可以方便用户在非仿真的情况下,hold内核、单步、全速、设置断点、查看内核和外设寄存器、读取flash代码等等,方便大家拥有最高的权限查看在运行中的MCU情况,查找非IDE仿真情况下,MCU运行异常的原因。 目录 驱动安装 …

粉笔科技张小龙:能传授知识文化和技能,就是对社会的贡献和交代

粉笔科技张小龙在一次粉笔科技的管培生大会上强调,今天是互联网时代,你只有为别人提供价值,提供更高品质的价值,以及更高效率的提供价值,你才有价值。一个企业是这样,一个人也是这样。#张小龙# 你把事情做到…

微服务框架 SpringCloud微服务架构 分布式缓存 42 Redis 主从 42.4 数据同步原理【优化】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式缓存 文章目录微服务框架分布式缓存42 Redis 主从42.4 数据同步原理【优化】42.4.1 主从同步的问题优化42.4.2 总结42 Redis 主从 42…

QA | SWCF2022 笔记:C波段卫星与5G之间的干扰排查及解决方案

2022年度SWCF卫星通信与仿真测试研讨会正在进行中。昨日精彩演讲:C波段卫星与5G之间的干扰排查及解决方案,昨晚收到一些粉丝的技术问题,我们汇总了热点问题并请讲师详细解答。 演讲主题:C波段卫星与5G之间的干扰排查及解决方案 干…

龙芯内核的UOS安装 Mariadb-server

1.安装 Mariadb-server 1.1安装配置 sudo apt install mariadb-server启动数据库 systemctl start mariadb;设置数据库自启动 systemctl enable mariadb;对数据库进行一些设置 mysql_secure_installation输入当前密码(因为是第一次安装,没有密码&am…

基于Android的应用市场软件的设计

基于Android的应用市场软件的设计 摘  要 随着智能手机的普及,人们越来越依赖手机进行一系列操作。 由于Android系统是一款免费的操作系统,导致了使用Android系统的手机占到7成左右。为了让Android手机用户体验更好,就需要让Android手机用…

【linux】之私有云OpenStack手动分布式部署

一、环境准备 参考: https://docs.openstack.org/zh_CN/install-guide/ 1, 静态IP(NetworkManager服务可以关闭) 2,主机名与绑定 192.168.122.11 controller 192.168.122.12 compute 192.168.122.13 cinder3, 关闭防火墙和selinux 4, 时间同步 所有节点准备yum源 # yum …

12.6、后渗透测试--Windows系统下信息收集模块

一、存活主机发现 步骤1、使用arp查看缓冲表:meterpreter > arp步骤2、局域网内存活主机发现:meterpreter > run post/windows/gather/arp_scanner RHOSTS172.16.0.0/24二、应用程序枚举 方法1: 获取靶机上的软件安装信息meterpreter…

免费刷题的软件测试面试题库小程序,萌新必备

现如今,不仅学习卷、考证卷,就连找工作也开始卷得没边了。就如最近几年新崛起的软件测试岗位,很多人为了能过快速通过面试,或者拿到offer,纷纷在面试前几周左右,不惜花重金,购买面试题目&#x…

【总结】有三AI所有原创GAN相关的学习资料汇总(2022年12月)

GAN的研究和应用在这几年发展可以说是非常迅猛,无疑是这几年深度学习计算机视觉领域里落地性最酷的技术之一,包括图像与视频生成,数据仿真与增强,各种各样的图像风格化任务,人脸与人体图像编辑,图像质量提升…