在学java web的时候碰到了一个DAO设计模型的东西,代码示例过了一遍后,发现这个结构就是将代码模块化,因为结构清晰故而便于组织,但是其中有个工厂类,这个类的作用就是说将对象的实例化分离出来,单独用这个类来实现,下面是示例:
定义一个类:
public Class Person{
相关属性与方法。。。
}
工厂类:
public Class Factory{
public Person getPerson(){
return new Person();
}
}
这个我就不懂了,为啥我要用另外一个Factory类来初始化Person类实例对象,这不是多此一举吗。
在知乎中看到一位兄弟写的理解,以下为我对其的总结:
我们从两个角度来分析——“定义了工厂类”和“未定义工厂类”
一.未定义工厂类
DAO这个结构首先它就是去耦合的,对于工厂类,我们将其省掉也是可以实现多态,比如下面这样,直接调用Service实例作为参数:向上转型为Service接口,也可以去耦合。
interface Service{
void method1();
void method2();
}
public static void serviceConsumer(Service s){
s.method1();
s.method2();
}
不过,上面的向上转型去耦合也有一定的问题,因为向上转型后的实例其能调用的属性和方法只能是Service类中存在的属性与方法,比如说:
package com.test;
public class Test {
public class Fa{
public int s1=1;
public int s2=2;
}
public class So extends Fa{
public int s3=3;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Fa s=new Test().new So();
System.out.println(s.s3);
}
}
像上面的输出其实是有错误的,由于向上转型,s并不能调用So定义的s3。
所以,虽说能够向上转型去耦合,但还是有一定的弊端和缺陷。故而在多态性中,如果需要的多态性类数量很多我们不可能将每个类都单独定义一遍,那样就太麻烦了,造成代码管理复杂。
故而,我们需要工厂类。
二.定义了工厂类
工厂方法模式重点不在于多态去耦合,而是关键在于“工厂模式”!在big4的DesignPattern书中里,工厂方法模式是和“虚拟工厂”模式,“生成器”模式,以及“单例器”模式,放在一起讲的,同属于“创建型模式”。
创建型模式最大的一个共同特征就是,把类型的“定义过程”和“实例化过程”分离开。也就是在类自身构造器之外,附加一个经常被误认为没什么卵用的“工厂类”,比如下面的ServiceFactory.
class ServiceA{
void method1(){};
void method2(){};
//构造器
ServiceA(){};;
}
class ServiceFactory{
Service getService(){};
}
但是实际上,实际工作中工厂类作用巨大。
就拿类的继承多态来讲,比如比如下面的这种情况:
class ServiceFactory{
Service getService(){
if(a条件){
ServiceA sA=new ServiceA();
}
if(b条件){
ServiceB sB=new ServiceB();
}
if(c条件){
ServiceC sC=new ServiceC();
}
}
}