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