effective java (1)(考虑使用!)静态工厂方法代替构造方法

只是目前阶段 对本书第一章内容的浅显认知,说实话 这一章 我看了4遍左右,每一遍感觉都不一样

他的创建模式 有时候像设计模式,但作者已经在原文中描述,它并不等价于 设计模式

我们正常 创建一个年级类 是长这样的

我们不写成标准的javabean模式 ,只是对  静态工厂方法 代替构造方法 一章的内容进行自己简单的理解实现   

这样写的 正常的,但是 这样的对未来 扩展性可能不是那么好,而且我们每次实例化该对象都需要new 一个,而且假如该对象 日后 成员变量增多,逻辑复杂,加载对象变多,我们 new对象的成本会增多,  用new 对象的方法 有时候对比于静态工厂方法 不够 清晰  所以我们  就可以用静态工厂方法代替构造方法  

怎么代替  看如下代码

1.与构造方法不同  静态工厂方法代替构造方法  时候,静态工厂方法具有名字,比较清晰

这样构造好之后,我们在test 类中测试一下


2.与构造方法不同的是 不需要每次都创建一个新对象

跟单例设计模式有点像,但是 作者已经在文中标注 他不等价于任何的设计模式

同时可以用该静态方法 限制了随意创建新对象

3.与构造方法不同,它们可以返回其返回类型的任何子类型的对象

同时他也是第四个优点

4.是返回对象的类可以根据输入参数的不同而不同

 直接看代码 

interface GradeLeader {
      void print();
 }
 class  teacher1 implements GradeLeader{
     @Override
     public void print() {
         System.out.println("我是teacher1 我被年级领导管理");
     }
 }
 class  teacher2 implements GradeLeader{
     @Override
     public void print() {
         System.out.println("我是teacher2 我被年级领导管理");
     }
 }
public class GradeFactory {
public  static GradeLeader valueOf(String teacherName){
    if(teacherName.equalsIgnoreCase("teacher1")){
        //这里返回的是 teacher 类型 的类  而不是 GradeLeader接口的实现
        return  new teacher1();
    } else if (teacherName.equalsIgnoreCase("teacher2")) {
        return  new teacher2();
    }
throw  new IllegalArgumentException("输入的老师名称 没有所属的领导啦");
}
}

当然 你也可以不用接口,用类,直接继承 也是可以的这样我们只需要 选择 是创建哪个类就行了 ,而不需要在乎他的具体类创建时的逻辑实现

5.静态工厂的第五个优点是,在编写包含该方法的类时,返回的对象的类不需要存在

 他的意思是 说  我们现在工厂方法里面只能返回teacher1 teacher2 对吧,假如说 我们将来想返回一个teacher3 ,我们完全可以 常见一个teacher3类,然后实现 Gradeleader 接口,然后再修改静态工厂方法 valueof就可以了,我们就不需要 修改 gradeleader 的接口内容,遵循开闭原则,对外扩展开放,对修改关闭

缺点

因为我们 有参 无参的构造全都是 私有的 ,所以我们无法继承该类

因为都是私有的 ,我们只关心输入参数,创建出来类使用就行了,但不知道内部的 一些内容,将来类中的静态工厂的方法多了之后,我们就很难找到 我们想要的实现的那个类 应该输入什么参数才能被创建出来

工厂类常用命名 从 书中copy 过来的

  • from —— 类型转换方法,它接受单个参数并返回此类型的相应实例,例如:Date d = Date.from(instant);
  • of —— 聚合方法,接受多个参数并返回该类型的实例,并把他们合并在一起,例如:Set\ faceCards = EnumSet.of(JACK, QUEEN, KING);
  • valueOf —— from 和 to 更为详细的替代 方式,例如:BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
  • instance 或 getinstance —— 返回一个由其参数 (如果有的话) 描述的实例,但不能说它具有相同的值,例如:StackWalker luke = StackWalker.getInstance(options);
  • create 或 newInstance —— 与 instance 或 getInstance 类似,除此之外该方法保证每次调用返回一个新的实例,例如:Object newArray = Array.newInstance(classObject, arrayLen);
  • getType —— 与 getInstance 类似,但是在工厂方法处于不同的类中的时候使用。getType 中的 Type 是工厂方法返回的对象类型,例如:FileStore fs = Files.getFileStore(path);
  • newType —— 与 newInstance 类似,但是在工厂方法处于不同的类中的时候使用。newType中的 Type 是工厂方法返回的对象类型,例如:BufferedReader br = Files.newBufferedReader(path);
  • type —— getType 和 newType 简洁的替代方式,例如:List\ litany = Collections.list(legacyLitany);

具体用公共构造方法 还是 静态工厂  还是看后期的需求

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

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

相关文章

机械拆装-基于Unity-总体设计

前言 在工业设计和制造领域,零部件的拆装技术是一个重要的应用场景,比如我们在工程训练课程中经历的摩托车发动机拆装课程,是机械类学生的必修课程。虚拟拆装系统模拟和仿真了模型的拆装过程,虽然SolidWorks等机械设计软件能够解决…

Splashtop 的屏幕录制功能如何提高 IT 合规性

在当今的数字时代,随着远程办公的普及以及监管要求和网络安全威胁的加剧,IT 副总裁、首席信息官(CIO)等 IT 管理人员面临着一系列独特挑战。 各组织在远程支持运营中要全力维护合规性、提高安全性并坚持问责制,技术解…

瓦罗兰特新赛季更新资讯 瓦罗兰特新赛季免费加速器

瓦罗兰特新赛季来喽,这是一款由拳头开发的免费第一人称射击游戏,游戏凭借其独特的玩法和丰富的英雄选择吸引了大量玩家。 我们可以在游戏中选择自己喜欢的角色出场与敌人进行对战,而且每一个角色都有自己独特的道具以及技能,使用好…

实体零售连锁企业如何通过物流接口实现数智化转型升级?

在电子商务浪潮的持续冲击下,传统的实体零售行业面临着巨大的挑战。为了在线上线下融合的新零售时代保持竞争力,众多实体零售企业积极寻求数字化转型的突破。 某中国零售连锁百强企业近年来致力于打造自有品牌的线上销售体系,自2021年8月起接…

高效管理客户的秘诀:企业如何建立稳固的客户关系

如今的竞争,从商业模式、产品、服务到销售环节,竞争已经不再是单一层面的,而是全方位的,企业需要打造全价值链竞争优势。在这个过程中,客户管理的作用是无可替代的,成为企业成功的关键因素之一。如何高效地…

Excel表格转换Word文档的3个简单方法分享!

在日常办公中,我们经常需要将Excel表格中的数据转换为Word文档以便于编辑、排版或分享。然而,很多人可能并不清楚如何实现这一转换过程,或者只能采取复制粘贴的笨拙方式,导致格式错乱、效率低下。本文将详细介绍两种高效、便捷的E…

企业应该如果安全上网,软件防查盗版,企业防盗版

随着信息化的发展,企业日常办公越来越依赖互联网。终端以及普通PC终端在访问互联网过程中,会遇到各种各样不容忽视的风险,例如员工主动故意的数据泄漏,后台应用程序偷偷向外部发信息,木马间谍软件的外联,以…

精密机器中的交叉导轨负荷与容许负荷的差异!

交叉导轨的设计和制造过程中,负荷及容许负荷是至关重要的参数,只有准确计算出交叉导轨的载荷,才能保证交叉导轨的稳定性和使用寿命。 负荷和容许载荷是两个不同的参数,那这两者的有什么差异呢? 交叉导轨的负荷是指其承…

【Linux 命令行参数解析函数getopt()】原理及直白理解

最近写代码恰好碰见getopt()这个函数,去网上找了很久,说实话,其他人写的有点看不懂,所以将我认为可以便于理解的地方描述一下: int getopt(int argc, char * const argv[], const char *optstring);首先理解这个函数的…

军用光电耦合器产品的市场潜力与应用前景

光电耦合器作为现代军事技术中的关键组件,其在军用领域的市场空间和应用前景备受关注。本文将深入分析光电耦合器产品在军事领域中的市场潜力,探讨其技术特点、应用场景及未来发展趋势。 光电耦合器技术特点与工作原理 光电耦合器是一种能够将电信号与光…

HDC Cloud 2024 | CodeArts加速软件智能化开发,携手HarmonyOS重塑企业应用创新体验

2024年6月21~23日,华为开发者大会HDC 2024在东莞溪流背坡村隆重举行。期间华为云主办了以“CodeArts加速软件智能化开发,携手HarmonyOS重塑企业应用创新体验”为主题的分论坛。论坛汇聚了各行各业的专家学者、技术领袖和开发者,共同探讨Harmo…

解决Transformer根本缺陷,所有大模型都能获得巨大改进

即使最强大的 LLM 也难以通过 token 索引来关注句子等概念,现在有办法了。 最近两天,马斯克和 LeCun 的口水战妥妥成为大家的看点。这两位 AI 圈的名人你来我往,在推特(现为 X)上相互拆对方台。 LeCun 在宣传自家最新论…

VERYCLOUD睿鸿股份确认参展2024年ChinaJoy BTOB商务洽谈馆,期待与你相聚

作为在全球数字娱乐领域兼具知名度与影响力的年度盛会,2024年第二十一届ChinaJoy将于7月26日至7月29日在上海新国际博览中心盛大召开,本届展会主题为:初心“游”在,精彩无限!(Stay True, Game On.&#xff…

阿一网络安全培训中心专门为你准备了一份WScan使用教程

下载地址:https://github.com/chushuai/wscan/releases 版本的选择 Windows就选windows_amd64 Linux就选linux_amd64 mac就选darwin_amd64 下载好后,运行一次exe会生成一个config.yaml文件 把该文件中plugins下面的所有插件的enabled设置为True。&…

Java养老护理助浴陪诊小程序APP源码

💖护理助浴陪诊小程序💖 一、引言:养老新趋势🌱 在快节奏的现代生活中,养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务,让他们晚年生活更加安心、舒适,是我们每个人都需…

CentOS7环境下DataX的安装、使用及问题解决

DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变…

六、常用API ★ ✔

六、常用API 模块14.基础API第一章.String1.String介绍2.String的实现原理 ★3.String的创建 (无参、字符串、字符数组、字节数组)4.String 面试题【String s new String("abc")】5.字符串常见问题 第二章.String的方法1.判断方法&#xff08…

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等

简介 TypeScript 是 JavaScript 的超集,是 JavaScript(弱类型语言) 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中,社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而,随着技术的迅猛发展和用户需求的不断变化,Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界,分析数字社交的发展…

上海六十中学多功能气膜馆项目:轻空间全速推进

项目进展捷报频传 上海六十中学多功能气膜馆项目土建工作已基本完工,今天轻空间团队正式进场,展开气膜部分的施工。我们将为上海六十中学打造一个现代化、环保、高效的多功能气膜馆,提供优质的运动和活动场所。 现场施工一片繁忙 在施工现场&…