java 工厂类静态方法,为什么要在JAVA工厂模式中使用静态方法

工厂方法模式( Factory Method ):定义一个用于创建对象的接口 IFactory,在具体的ConcreteFactory子类中根据传进的参数即具体子类ConcreteProduct决定实例化哪一个IProduct产品,该模式使得一个类(即IProduct)的实例化延迟到其子类(即ConcreteProduct)

今晚看代码的时候看到工厂类中方法和参数都使用static修饰,于是很好奇的想为什么一定要使用静态方法。百度了一下,发现百度了一堆垃圾,根本没有找到自己想要的答案。后来去Stack Overflow,果然找到了相关的问题。因为是英文的,所以翻译过来并综合整理了一下。

为什么要在工厂模式中使用静态方法

工厂模式是一种封装对象创建的方法。如果不使用工厂模式,你就需要直接使用构造方法来创建对象:

Foo x = new Foo()

使用工厂模式,就可以取而代之的调用工厂方法:

Foo x = Foo.create()

工厂类的构造方法被标记为private,所以构造方法除了在类的内部被调用以外就不能够被访问。工厂类的其他方法被标记为static,这样就不需要在调用该方法之前必须首先拥有一个该类的对象。

使用工厂模式有一些好处。其一工厂类可以从许多子类(subclasses)(或者一个接口的实现)并返回它( One is that the factory can choose from many subclasses (or implementers of an interface) and return that. )。用这种方式调用方法可以通过参数来确定类的行为而不需要知道或者理解类的潜在的复杂层次(This way the caller can specify the behavior desired via parameters, without having to know or understand a potentially complex class hierarchy.)。本文主要介绍如何使用静态工厂方法已经在那种场合来使用这种方式代替构造方法。        众所周知,对于类而言,我们为了获得一个类的实例对象,通常情况下会提供一个公有的(public) 的构造器。当然除了这种方法以外,我们还可以通过给类提供一个public的静

另一个好处是,控制对一个有些资源的访问,比如数据库连接(connection)。这是一种实现重用对象池(pools of reusable objects)的方法而不是简单粗暴的先实例化对象,然后使用并销毁对象。如果实例化和销毁对象的代价很高,那么建立一次并重复使用对象就显得意义非凡了。工厂方法可以返回一个已经实例化了但么有被使用的对象;或者如果对象数量小于指定的对象数量时,可以直接实例化一个对象;或者如果对象数量大于了指定的对象数量的时抛出异常并返回null。

下面是一个数据库连接的工厂类的简单实现:

public class DbConnection

{

private static final int MAX_CONNS = 100;

private static int totalConnections = 0;

private static Set availableConnections = new HashSet();

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 db)

{

//...

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值