JAVA设计模式之工厂系列

来源:互联网 发布:聚类算法优劣指标 编辑:程序博客网 时间:2024/05/21 09:07

通过该项目谈我对工厂模式的认识:

 哎,全是白话啊!
  "老张开车去东北"
***********************************************************第一步*************************************************************** 
1、首先定义一个Car类表示车,该辆车有一个run()方法,
 这辆车可以由老张自己new出来;但是这样的话老张可以自己new出很多辆新车,并且每一辆和每一辆都不同;
2、现在在Car类中采用单例模式,实现让老张不能自己new,但是可以get到一辆车,不过这时每次得到的是同一辆车;
 单例模式三要素:
 * 将构造方法定义为private,这样别人就不能new啦!
  private Car(){}
 * 定义一个静态属性(当然就是自己啦!如果定义的是一个List<Car> cars 的话,那就是多例啦!嘿嘿...)
  private static Car car = new Car();
 * 提供一个静态方法返回上面的car
  private static Car getInstance(){
   return car();
  }
 这时老张每次调用getInstance()方法获得的都是同一个Car对象

***********************************************************第二步*************************************************************** 
  "任意定制交通工具的类型"
  
现在只能是开车去东北,如果想开飞机或是骑扫帚去的话该如何实现呢???
3、那就只能采用多态啦!
 * 定义一个接口Movable(可以移动滴东东啦!)
  具体的交通工具实现这个接口。
 * 这样的话,老张在每次去东北之前就可以自己new出想要的交通工具啦!
  Movable m = new XXX();    //XXX为想要得到的交通工具的名称,如Car啦,Plane啦,等等...

***********************************************************第三步***************************************************************  
  "任意定制交通工具的类型和生产过程"
  
今天我们要探讨的是工厂模式,当然涉及到的是如何用工厂建造来建造(new)老张想要的交通工具啦!
4、为不同的交通工具定义不同的工厂类,如CarFactory 、 PlaneFactory 等等...
 工厂类内部当然要提供一个createXxx()方法来返回一个相应的交通工具实例啦!Xxx为new出来的交通工具的名称, 如Car啦,Plane啦,等等...
 
好的,到目前为止似乎看起来工厂模式不错,但是还不完善啊!如果说我们有很多种不同的交通工具的话,我们就需要定义很多个工厂类,会很麻烦滴!
5、好,我们来解决上面这个问题,同样采用多态的方法,和第二步中的类似:
 我们定义一个接口,该接口的名字为:VehicleFactory,提供一个create()方法,相信大家一看就明白啦!
 对,这个工厂就是用来建造交通工具的,但是它的create方法没有确定到底要建造哪种类型得交通工具,
 具体new出来的实例要看实现该接口的具体的工厂如何实现啦!
 VehicleFactory vf = new XxxFactory();   //XxxFactory就为具体的某种交通工具的建造工厂的名称啦!
 所以,直接 vf.create(); 就会返回老张想要得具体的交通工具的实例啦!
 好,现在我们只要修改XxxFactory就可以变化我们想要 得到的交通工具了,当然,如果我们把XxxFactory写道配置文件中的话,我们不用修改代码,
 直接修改配置文件就OK啦!
 
欧了,暂时我们就先写道这里吧!嘿嘿...

***********************************************************第四步***************************************************************
  "老张开着车,手持AK47,吃着苹果去东北"
现在我们要探讨的就不只是交通工具一个产品了,而是一系列产品,包括武器,食品等等...
这时老张可以"开着车,手持AK47,吃着苹果去东北",也可以"起着扫帚,拿着魔法棒,吃着毒蘑菇去东北"
我们就需要两套产品:

解决方案:
 * 定义一个抽象类(也可以为接口)AbstractFactory,该类提供三个不同的抽象的方法:
  CreateVehicle()、CreateWeapon()、CreateFood() 分别返回Vehicle,Weapon,Food,
  Vehicle,Weapon,Food为三个抽象类,其中分别封装了抽象方法:run();shoot();printName();
   Car、broom从Vehicle类继承并实现其方法run();
   AK47、MagicStick从Weapon继承并实现其方法shoot();
   Apple、Mushroom从Food继承并实现其方法printName();
 * DefaultFactory 和 MagicFactory 分别继承并实现了AbstractFactory类的三个方法:
  DefaultFactory 分别: return new Car();
              return new AK47();
              return new Apple();
  MagicFactory   分别:return new Broom();
                 return new MagicStick();
                 return new Mushroom();
  
  * 下面就是定义的两个Factory :DefaultFactory和MagicFactory 分别生产出两套产品,再调用其中的方法:
   run(); shoot(); printName();
   
   
DefaultFactory 类中的方法:createCar(),createAK47(),createApple() 分别返回Car 、AK47 、Apple
MagicFactory 类中的方法:      createBroom(),createMagicStick(),createMushroom() 分别返回 Broom 、MagicStick 、 Mushroom

Car和Broom类中的方法:run()
AK47和MagicStick类中的方法:shoot()
Apple和Mushroom类中的方法:printName()

***********************************************************第五步***************************************************************
好,现在我们还是回到最初的状态"老张开车去东北"
我们要从配置文件中读取信息来生产老张具体要求的交通工具是什么!?

现在有一个Movable接口,提供一个run()方法,两个类Car和Train实现该接口
我们知道当老张要得到自己想要得交通工具时需要执行下面的语句:
 Movable m = new Car();  或是   Movable m = new Train();
这时还是会需要去改代码才能实现滴!那么如何才能不接触代码就能实现呢,答案就是配置文件啦!嘿嘿...
这里我们采用properties文件,详细讲解当然要去看老马的tank大战视频啦!不过在这里这个不是重点,可以留作以后慢慢研究的啦!
1、建立spring.properties配置文件,在其中输入配置信息如下:
 VehicleTypeName=com.bjsxt.factory.Car(注意等号两边不要加空格!!!)
2、读取的代码就直接写给大家:
 Properties props = new Properties();
 props.load(Test.class.getClassLoader().getResourceAsStream(com/bjsxt/factory/spring.properties));
 String vehicleTypeName = props.getProperty("VehicleTypeName");
//  下面就要运用反射机制了
 Object o = Class.forName(vehicleTypeName);
 Movable m = (Movable)o;
 m.run();
好了,写好了,当然需要你自己处理异常哦! 我这里没有写。这时老张得到的就是一辆car,只要修改配置文件内容如下:
 VehicleTypeName=com.bjsxt.factory.Train 就可以得到一辆火车啦!
 需要注意的是,此时在Car和Train中不要将构造方法设为private的啊!

上面的内容还算简单吧!还望大家好好理解哦,工厂模式很重要滴!下面我们就要讨论spring中如何运用工厂方法了...

原创粉丝点击