当前位置: 首页 > news >正文

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

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

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

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

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

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

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

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


常说的设计模式是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("萨瓦");

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


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

相关文章:

  • 【SSM框架】为集合类型属性赋值
  • 不想写日报、周报,这个报表自动化软件太牛了,仅需三分钟
  • 14:30面试,14:38就出来了 ,问的实在是太...
  • electron-vue项目从搭建、运行到打包(以及electron-vue的bug修改)
  • 使用小爱同学语音控制电脑关机 - Winform C#
  • [附源码]Python计算机毕业设计仿咸鱼二手物品交易系统Django(程序+LW)
  • 31.前端笔记-CSS-CSS3盒子模型和其他特性
  • C语言split分割字符串
  • Python篇之编译py文件为pyc文件的方法总结
  • Windows学习总结(25)—— Windows 11 cmd 命令大全
  • 识破贷后资金归集——关联网络
  • 关于sysdiag的利用
  • 【推送位置苹果群发iMessage推】如果Windows和Linux实现不同的传输层协议,那末因为数据格式的不同
  • 12.6、后渗透测试--Windows系统下信息收集模块
  • 含参PDE(偏微分方程)的神经网络并行编程mpi4py
  • (三)从jvm层面了解线程的启动和停止
  • [译]如何构建服务器端web组件,为何要构建?
  • 【剑指offer】让抽象问题具体化
  • Android优雅地处理按钮重复点击
  • Bytom交易说明(账户管理模式)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java,console输出实时的转向GUI textbox
  • Koa2 之文件上传下载
  • vue的全局变量和全局拦截请求器
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从伪并行的 Python 多线程说起
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 高程读书笔记 第六章 面向对象程序设计
  • 回顾2016
  • 解决iview多表头动态更改列元素发生的错误
  • 开源地图数据可视化库——mapnik
  • 排序算法学习笔记
  • 盘点那些不知名却常用的 Git 操作
  • 实战|智能家居行业移动应用性能分析
  • 温故知新之javascript面向对象
  • 小试R空间处理新库sf
  • - 转 Ext2.0 form使用实例
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1)Nginx简介和安装教程
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (力扣题库)跳跃游戏II(c++)
  • (生成器)yield与(迭代器)generator
  • (十六)Flask之蓝图
  • (一)Linux+Windows下安装ffmpeg
  • (一)VirtualBox安装增强功能
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)LINQ之路
  • (转)可以带来幸福的一本书
  • (转载)(官方)UE4--图像编程----着色器开发
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET Core IdentityServer4实战-开篇介绍与规划