静态工厂方法的前世今生| Java Debug 笔记

简介: 静态工厂方法的前世今生| Java Debug 笔记

前言

静态工厂方法,你是否听说过呢?在学习Java过程中,我们会遇到很多概念性的方法,那么如何学习呢,本次,我们来输出下相关的学习方式。

问题复现

问题的缘起,来自一个问题,那就是,什么是静态工厂方法?

问题解决

我们避免直接访问数据库连接,因为它们是资源密集型的。因此getDbConnection,如果我们低于限制,我们将使用静态工厂方法来创建连接。否则,它将尝试提供“备用”连接,如果不存在则失败,并显示异常。

public class DbConnection{
   private static final int MAX_CONNS = 100;
   private static int totalConnections = 0;
   private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();
   private DbConnection(){
     // ...
     totalConnections++;
   }
   public static DbConnection getDbConnection(){
     if(totalConnections < MAX_CONNS){
       return new DbConnection();
     }else if(availableConnections.size() > 0){
         DbConnection dbc = availableConnections.iterator().next();
         availableConnections.remove(dbc);
         return dbc;
     }else {
         throw new NoDbConnections();
     }
   }
   public static void returnDbConnection(DbConnection dbc){
     availableConnections.add(dbc);
     //...
   }
}

该静态工厂方法模式是一种封装对象的创建。如果没有工厂方法,则只需直接调用类的构造函数:Foo x = new Foo()。使用这种模式,您可以改为调用factory方法: Foo x = Foo.create()。构造函数被标记为私有,因此只能从类内部调用它们,并且将工厂方法标记为,static以便无需首先具有对象就可以对其进行调用。

这种模式有一些优点。一种是工厂可以从许多子类(或接口的实现者)中进行选择并返回。这样,调用者可以通过参数指定所需的行为,而不必了解或了解潜在的复杂类层次结构。

正如Matthew和James所指出的那样,另一个优势是控制对有限资源(例如连接)的访问。这是一种实现可重用对象池的方法-而不是构建,使用和拆除对象,如果构造和销毁是昂贵的过程,则一次构造它们并回收它们可能更有意义。factory方法可以返回一个现有的,未使用的实例化对象(如果有),或者如果对象计数低于某个下限阈值,则构造一个对象,或者,null如果它高于上限阈值,则引发异常或返回。

根据Wikipedia上的文章,多种工厂方法还允许对类似参数类型进行不同的解释。通常,构造函数与类具有相同的名称,这意味着您只能有一个具有给定签名的构造函数。工厂并不是那么受约束,这意味着您可以有两种接受相同参数类型的不同方法:

Coordinate c = Coordinate.createFromCartesian(double x, double y)

Coordinate c = Coordinate.createFromPolar(double distance, double angle)

通过静态工厂方法,增加可读性。

总结

一切都归结为可维护性。每当使用new关键字创建对象时,便会将正在编写的代码耦合到实现上。

工厂模式使您可以将创建对象的方式与处理对象的方式分开。当使用构造函数创建所有对象时,实际上是在使用硬编码将使用该对象的代码连接到该实现。使用您的对象的代码“依赖于”该对象。从表面上看,这似乎没什么大不了,但是当对象改变时(想改变构造函数的签名,或子类化对象),您必须返回并重新布线到任何地方。


目录
相关文章
|
1月前
|
前端开发 Java 图形学
[笔记] 疯狂JAVA讲义(第3版)第11章 AWT编程
[笔记] 疯狂JAVA讲义(第3版)第11章 AWT编程
|
21天前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
1月前
|
Java 索引
[笔记] 疯狂JAVA讲义(第3版)第4章 流程控制与数组
[笔记] 疯狂JAVA讲义(第3版)第4章 流程控制与数组
|
1月前
|
Java 程序员 API
[笔记] 疯狂JAVA讲义(第3版)第3章 数据类型和运算符
[笔记] 疯狂JAVA讲义(第3版)第3章 数据类型和运算符
|
1月前
|
安全 Java
深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
16 1
|
1月前
|
算法 Java 索引
12.12_黑马数据结构与算法笔记Java
12.12_黑马数据结构与算法笔记Java
21 1
|
20天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
15 0
|
20天前
|
Java Maven Python
技术笔记:Lombok介绍、使用方法和总结
技术笔记:Lombok介绍、使用方法和总结
19 0
|
1月前
|
数据可视化 Java 测试技术
[笔记] 疯狂JAVA讲义(第3版) 第2章 理解面向对象
[笔记] 疯狂JAVA讲义(第3版) 第2章 理解面向对象
|
1月前
|
IDE Oracle Java
[笔记] 疯狂JAVA讲义(第3版) 第1章 Java语言概述与开发环境
[笔记] 疯狂JAVA讲义(第3版) 第1章 Java语言概述与开发环境