Java静态工厂方法与工厂模式

静态工厂方法和工厂模式很像,但是在java中还是有很大区别的。

(一)静态工厂方法vs工厂模式


对于一个类来说,为了让客户端获得一个自身的实例,最常用的方法就是提供一个公有的构造器。除了这种使用构造器的方法之外,对于单个类来说,我们可以定义静态工厂方法来获取自身的类的一个实例。静态工厂方法和工厂模式的不同也体现在此,静态工厂方法是获取这个类自身的一个实例,他的存在是为了更好的描述和处理这个类。而工厂模式的作用更在于解耦,让每个类在实例化的时候不再使用new这种耦合度极高的方法。

我们通过静态工厂方法来代替构造器,我们首先需要知道的是静态工厂方法只是一个“普通的方法”。的确,我们将具有:返回这个对象的一个实例这种特点的静态方法叫做静态工厂方法,它在理论上与其他方法并没有什么不同。但是也正是因为他是一种”普通的方法“,它具有很多构造器不具备的优点。

工厂方法又分为三种模式:简单工厂模式、工厂模式(工厂方法模式)、抽象工厂模式。这三种是为了一个目标的不同程度的抽象。工厂方法用一种比静态工厂方法更加系统的理论来对每一个需要使用的对象进行包装。这种包装下再也不使用new来创建对象,随着抽象程度的变高,我们甚至可以将这种创建对象放到xml或者注释之中——就像是那么多框架做的一样。

总而言之,静态工厂方法在一个类的内部,较小的范围里可以让你创建对象更加方便优雅,而工厂模式在大的范围中能够让你的代码重用性更佳,耦合度更低。

(二)静态工厂方法可以有不同的名字


对于普通的构造器来说,通过参数来对类中的不同属性赋值,然后返回一个这个类的相应实例。但在有些时候,如果我们想获得有些差别的类实例,唯一可以采用的方法是通过不同的构造器参数列表来区分不同的实例。但是这并不是一个好主意,因为有的时候,仅仅是构造器方法签名上的不同,可能会让客户端用户迷惑,只是参数顺序的变化让他们很难去记住到底哪个构造对应的是哪个实例

这个时候可以考虑使用静态工厂方法,为不同的构造方法来起不同的名字来区分不同功能的实例化,而返回的都是一个this,这样类似构造器的操作让不同的实例可以被更加容易的区分。

(三)静态工厂方法可以返回一个现有的实例


每当我们调用构造器,每当我们使用new来初始化一个对象时,都无疑是在堆上创建了一个新的对象。而有些不可变的类、不希望被实例出多个对象的类不用也不必每次都创建一个对象。通过静态工厂方法,我们可以直接向客户端返回一个我们早已创建好的对象,对于有些不可变的类,比如基本类型包装类,这样做可以极大地节省我们的开销

对于单例模式的类,只允许每个类中存在一个已经实例化的对象。对于单例模式来说,构造器都会被声明为private,我们不能也无法构造一个对象,只能通过静态工厂方法来获取他的对象。这种手法在很多很多包中都有体现,尤其是那些比较重量级的类(其实我们也恰好总喜欢把这种变量其名为factory),更需要这种手法来操作对象。

(四)静态工厂方法可以作为视图返回子类型


视图这个名词有很多解释,在这里视图的解释是java集合框架中的视图方法——通过返回一个List(或者其他具体类型的祖先类,Set,Map等)对象,让那些List的子类都可以来调用这个方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值