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

静态工厂方法替代构造器

在类的内部讲构造器私有化,创建一个static的构造方法,就是静态工厂方法替代构造器。
最简单的一个静态工厂方法替代构造器示例:(好处就是创造时更清晰)

public class Book {private String title;private String author;  // 私有构造函数,防止直接实例化private Book(String title, String author) {this.title = title;this.author = author;}// 静态工厂方法public static Book createBookByTitleAndAuthor(String title, String author) {return new Book(title, author);}
}

单例模式,多例模式,池化模式下,使用静态工厂方法,有一定优势:(静态工厂方法的最重要的优点)

public class Car{private static final Map<String,Car> carPool=new HashMap<>();private String model;private Car(model){this.model=model;}public static Car createCar(String model){Car car=carPool.get(model);if(car==null){car=new Car(model);carPool.put(model,car);}return car;}
}

使用一个接口来实现静态工厂方法:

public interface Car {void drive();static Car createCar(String type) {if (type.equalsIgnoreCase("Sedan")) {return new Sedan();} else if (type.equalsIgnoreCase("SUV")) {return new SUV();}throw new IllegalArgumentException("Unknown car type");}class Sedan implements Car {@Overridepublic void drive() {System.out.println("Driving a Sedan");}}class SUV implements Car {@Overridepublic void drive() {System.out.println("Driving an SUV");}}
}public class Main {public static void main(String[] args) {Car sedan = Car.createCar("Sedan");sedan.drive();  // 输出: Driving a SedanCar suv = Car.createCar("SUV");suv.drive();  // 输出: Driving an SUV}
}

相关文章:

  • 【ai】Omniverse 微服务架构及NVIDIA Omniverse™ Launcher
  • 【C语言】32个关键字
  • 软件版本号的管理
  • 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版9(附带项目源码)
  • 自动求导实现与可视化
  • 算法训练营day56
  • MT2096 数列分段
  • 六种图算法的python实现
  • 前端的强缓存和协商缓存
  • Pixi.js学习 (六)数组
  • 前端面试题日常练-day60 【面试题】
  • 鸿蒙轻内核M核源码分析系列六 任务及任务调度(2)任务模块
  • UnityAPI学习之Animator的基本使用
  • UE4获取动画序列资产的动画时长
  • 【Linux】I/O多路复用
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 10个最佳ES6特性 ES7与ES8的特性
  • 77. Combinations
  • echarts花样作死的坑
  • IOS评论框不贴底(ios12新bug)
  • Javascript Math对象和Date对象常用方法详解
  • Javascript设计模式学习之Observer(观察者)模式
  • PHP 小技巧
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • sublime配置文件
  • Vue组件定义
  • 安卓应用性能调试和优化经验分享
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 离散点最小(凸)包围边界查找
  • 微信开源mars源码分析1—上层samples分析
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (06)金属布线——为半导体注入生命的连接
  • (7) cmake 编译C++程序(二)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (k8s)Kubernetes本地存储接入
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (蓝桥杯每日一题)love
  • (排序详解之 堆排序)
  • (三分钟)速览传统边缘检测算子
  • (原创)可支持最大高度的NestedScrollView
  • . Flume面试题
  • .naturalWidth 和naturalHeight属性,
  • .NET Core引入性能分析引导优化
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • :“Failed to access IIS metabase”解决方法
  • @JsonFormat与@DateTimeFormat注解的使用