【知识储备】关于java工厂模式浅谈回顾、以及和接口的辨析

来源:互联网 发布:乌鲁木齐 网络订花 编辑:程序博客网 时间:2024/06/05 04:42

Q:我想知道用工厂作为参数到底比直接用接口作为参数好在哪里。在调用把工厂作为参数的方法时,虽然不用指明实现接口的类,但是要指明实现工厂的类,并没有提高代码的重用性啊。请大家指点。


A1:工厂做参数的话,你只需要去根据这个参数自动调用接口,而不用具体管它的如何实现
如果你接口做参数的话,那么你还得去实例化实现接口这个类。。
你感觉哪个更方便点呢?
这就好比人、工厂、和斧子的问题
建议去看看《spring2.0开发宝典》


A2:工厂模式楼主不知道清楚没? 
程序部分只需要与工厂耦合,而无须与具体的实现类耦合在一起。 
程序获得工厂的引用,程序部分能够获得所有工厂产生的实例,想拿什么就拿什么, 
而且重要接口不发生变化调用者程序代码部分几乎无须发生任何改动。同时松耦合问题也能解决 
关于你说的提高代码的重用性,那是接口的变化,如果你直接操作接口而你不是操作工厂的话 
那么如果根据需求变了这个接口,那么同时调用这个接口的其他代码…


______________________________________________________________________________________________________________________________


程序部分只需要与工厂耦合,而无须与具体的实现类耦合在一起。 
程序获得工厂的引用,程序部分能够获得所有工厂产生的实例,想拿什么就拿什么, 
而且重要接口不发生变化调用者程序代码部分几乎无须发生任何改动。同时松耦合问题也能解决 
关于你说的提高代码的重用性,那是接口的变化,如果你直接操作接口而你不是操作工厂的话 
那么如果根据需求变了这个接口,那么同时调用这个接口的其他代码就需要改动

 

工厂做参数的话,你只需要去根据这个参数自动调用接口,而不用具体管它的如何实现 
如果你接口做参数的话,那么你还得去实例化实现接口这个类。。 
这就好比人、工厂、和斧子的问题

 

引入人、工厂、和斧子的问题:

 

  (1),原始社会时,劳动社会基本没有分工,需要斧子的人(调用者)只好自己去磨一把斧子,每个人拥有自己的斧子,如果把大家的石斧改为铁斧,需要每个人都要学会磨铁斧的本领,工作效率极低。

  对应Java里的情形是:java程序里的调用者new一个被调用者的实例。类耦合度极高,修改维护烦琐,效率极低。

  (2),工业社会时,工厂出现,斧子不再由普通人完成,而由工厂生产,当人们需要斧子的时候,可以到工厂购买斧子,无需关心斧子是怎么制造出来的,如果废弃铁斧为钢斧,只需改变工厂的制造工艺即可,制作工艺是工厂决定的,工厂生产什么斧子,工人们就得用什么斧子。

  对应的Java里的情形是:Java程序的调用者可以以来简单工厂创建被调用者,变化点被隔离到了简单工厂里,虽然耦合度降低,但是调用者会和工厂耦合,而且需要定位自己的工厂。

  (3)近代工业社会,工厂蓬勃发展,人们需要什么斧子,只需要提供一个斧子图形,商家会按照你提供的图形将你的斧子订做好,送上门。

 

附赠一个解析的实例:

 

工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A(). 工厂模式也是用来创建实例对象的,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。 

类Sample为例,要创建Sample的实例对象: 

Sample sample=new Sample(); 
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等 

首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成: 

Sample sample=new Sample(参数); 

但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了 

初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。 

我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。 

你想如果有多个类似的类,我们就需要实例化出来多个类。这样代码管理起来就太复杂了。 
这个时候你就可以采用工厂方法来封装这个问题。 
不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample 

Sample mysample=new MySample(); 
Sample hissample=new HisSample(); 
采用工厂封装: 



  1. public class Factory{ 
  2.   public static Sample creator(int which){ 
  3.   //getClass 产生Sample 一般可使用动态类装载装入类。 
  4.   if (which==1
  5.     return new SampleA(); 
  6.   else if (which==2
  7.     return new SampleB(); 
  8.   } 

那么在你的程序中,如果要实例化Sample时.就使用 




  1. Sample sampleA=Factory.creator(1); 

举个更实际的例子,比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等,那么连接数据库的代码是不一样的,你用传统的方法,就不得不进行代码修改来适应不同的环境,非常麻烦,但是如果你采用工厂类的话,将各种可能的数据库连接全部实现在工厂类里面,通过你配置文件的修改来达到连接的是不同的数据库,那么你今后做迁移的时候代码就不用进行修改了。 

我通常都是用xml的配置文件配置许多类型的数据库连接,非常的方便。



转载自:http://blog.csdn.net/lihan6415151528/article/details/3588789 

上面部分Q、A来源于:http://topic.csdn.net/u/20081222/12/822bff4a-27d5-40e8-a853-167c1b435900.html

原创粉丝点击