本篇博客转自百度知道
在工厂类里面工厂方法为什么是静态的,要靠类名来调用?如:
public class Factory{
public static getInstance(){
return XXX();
}
}
客户端调用:Factory.getInstance();而
public class Factory{
public XXX getInstance(){
return XXX();
}
}
客户端调用:
Factory f = new Factory();
f.getInstance();
这样可以吗?如果不可以,是不是因为这样客户端要创建一个工厂对象,相对于类名直接调用,增加了开销,而且用户和工厂紧耦合了??
Factory.getInstance();---类名调用,这样不属于紧耦合吗?
望高手指点!
-----------------------------------------------------------------------------------------------------------------
我们来看两种区别:
1。客户端调用Factory f = getInstance(); f.XXX();
2。客户端自己生成 Factory f = new Factory(); f.XXX();
表面上来看,结果是一样的,但实际上,体现的java设计能力上的本质区别
由客户端自己生成Factory 也就是new Factory ()出来,客户端必须自己控制工厂的生成和构造,客户端必须非常清楚工厂的构造函数(比如构造函数有多少个参数,输入参数时有什么条件等等),也知道工厂的内部细节,一旦工厂扩展或者改变了,客户端在没有得到通知的情况下就不知道怎么调用了。
而getInstance(); 得到的工厂,客户端没有直接调用工厂的构造函数就得到了工厂的实例对象。所以客户端不需要了解工厂的构造细节,一旦工厂内部发生变化,客户端也不需要关心。它只需要关心最后的结果就行了,所有需要关心的内容都被getInstance方法处理了。
最后举一个实例来说明:
客户1: 经理
客户2: 员工
工厂: 报表生成系统 (它能为所有客户生成报表)
客户想看的内容: 业绩报表
采用getInstance得到报表时: 报表生成系统(工厂)生成报表对象,交给客户1或者客户2; 客户1和2都不必知道工厂的内部细节和构造函数。
getInstance方法内可以进行扩展,从而有了逻辑判断(这里非常非常重要,也是你了解本题的突破点!):
if(登陆客户是经理) {
生成全体员工的报表;
分配客户全部管理权限;
return 全部员工的业绩报表实例;
}else if(登陆客户是普通员工){
生成该员工的报表:
分配简单的管理权限;
return访员工的业绩报表实例;
}
如果你不采用这种方法,而采用 Factory f=new Factory()
要实现这么灵活的调用怎么可能呢?
何况更重要的原因是,不安全啊, 客户如果知道如何构造工厂,就可以自己给自己安排重要的权限,那么整个机密资料就可以被任何人拿走。所以,构造工厂的细节和内部逻辑是绝对不能暴露给客户端的。
请仔细体会面向对象设计的思想精华(绝对不是你在课本上学的那么简单)
对象设计思想进步后,再多花些时间去熟练23种设计模式。这非常重要。它是一个java工程师是 初级还是中级的分水岭!

浙公网安备 33010602011771号