类名直接调用与对象引用的区别

在工厂类里面工厂方法为什么是静态的,要靠类名来调用?如:
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工程师是 初级还是中级的分水岭!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值