福州做网站优化/抖音seo优化系统招商
java工厂模式三种详解(部分转载)
很好的一篇转载文章,原文章更加优秀!
我理解的工厂模式
为了代码的扩展性,使用套娃的模式封装代码,这样在代码扩展的时候,不改变对外调用的代码,只增加一些类。
注意开闭原则,也就是说对扩展开放,对修改关闭。这里准确的说是,可以增加类,但是尽量不要对类内部进行修改。
没有使用工厂模式
比如火影中的尾兽,是一个抽象类或者接口,这个接口有一个待实现的方法,使用技能,也就是使用大招;其他的尾兽,从一尾到九尾,是具体的实现类,每个尾兽有不同的大招实现。假如你是六道仙人,你拥有所有的尾兽,然后如果你和辉夜进行战斗的时候,你就需要选择某个尾兽进行战斗,先实例化一个尾兽,然后使用对应的大招。比如选择九尾,实例化九尾,念出九尾的大招使用!
这样做有什么弊端呢?你必须选择某个尾兽,然后使用相应的大招,速度慢啊!而且假如你增加了某个尾兽,那么你就必须增加这个尾兽的代码,然后改变使用它的代码。
特别是,你没有一个统一的调用方法!
简单工厂模式
现在你找到了一个简单的方法进行战斗,你创建了一个大招库(就是工厂),这个工厂只有一个作用,就是根据你输入的尾兽,自动的就使用大招,有什么不同吗?是的,现在你只需要输入一个尾兽的名字,自动就创建了这个尾兽的实例,并且使用相应的大招,也就是说,你不用在乎具体大招实现,你只需要输入一个尾兽的名字进工厂,然后就使用出大招了,速度就提升了,比如你输入九尾,然后自动就创建实例,然后使用大招,而你只做了一件事,就是传递尾兽的名字而已。
这就是简单工厂模式,也就是将对象的实例化进行了封装,外部调用不用在乎细节,直接用就行了。
多个工厂方法
上面的简单工厂模式,如果我们传递的尾兽名字出错,那大招就发不出来,还不完蛋了!
因此呢,我们在工厂中,为每个尾兽创建一个工厂方法,到时候想用哪个尾兽就直接使用这个工厂方法,比如要使用九尾,就使用九尾的工厂方法,然后就会自动创建九尾实例,使用九尾的大招。
多个静态工厂方法
以上的工厂调用其实也是实例化的,这样还是比较麻烦,因此我们可以让工厂方法是static的,这样就可以直接用工厂调用对应尾兽的静态工厂方法了。
抽象工厂方法
上面的代码虽然解决的了封装的问题,但是并不完美,因为如果增加了一个尾兽,我们需要添加一个尾兽的实现类,还要在工厂类中添加对应尾兽的工厂方法,因为工厂类是调用类,因此修改它就不符合开闭原则,也就是说对扩展开放,对修改关闭。这里准确的说是,最好的原则是,可以增加类,但是尽量不要对类内部进行修改。
怎么办呢,首先我们创建一个抽象工厂类或者一个工厂类接口,对每个尾兽创建不同的工厂类,实现这个接口,这样对外调用使用抽象工厂类就可以了,增加尾兽,就增加相应的尾兽工厂类即可。