JAVA工厂方法的疑问(为何要创建工厂类或者工厂接口)


在学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();
}
}
}




猜你喜欢

转载自blog.csdn.net/YaoDeBiAn/article/details/79826941