创建型模式:工厂方法

  

文章首发
创建型模式:工厂方法

  

创建型模式:工厂方法

  

简介

  

<强>姓名:工厂方法

  

<强>英文名:工厂方法模式

  

<强>价值观:扩展是我的专属

  

<强>个人介绍:

  

定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类实例化推迟到子类。(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类)。
(来自《设计模式之禅》)

  

你要的故事

  

还记得上一篇单例模式中的故事么?小明开着汽车去旅游,去学校,去聚会。这一次还是延续小明的故事,一个故事能讲2个设计模式,不容易呀…(每次想故事都想破脑袋,每一篇文章至少有3个故事从脑子里闪过,但最终留下的只有一个适合,为了就是能比较清晰简单的说明设计模式中的关键要点)。

  

简单工厂

  

小明家里以前不算很富裕,但是还是有一个不错的车,库什么汽车,摩托车,自行车啥的都放在这个车库里。小明每次要出去,都会到车库里面挑合适的车出发,比如,小明最近期末考试了,骑摩托车去学校考试,考完试之后,小明就准备去旅游,这次决定自驾游,开着自己家的小汽车去。这个场景我们用代码描述下。

  
 <代码类="语言java ">公共类SimpleFactoryTest {
  
  公共静态void main (String [] args) {
  小明小明=new小明();//小明骑摩托车去学校
  IVehicle摩托车=GarageFactory.getVehicle(“摩托车”);
  xiaoMing.goToSchool(摩托车);//小明开汽车去旅游
  IVehicle车=GarageFactory.getVehicle(“汽车”);
  xiaoMing.travel(车);
  }
  
  }/* *
  *车库
  */类GarageFactory {
  
  公共静态IVehicle getVehicle (String类型){
  如果(“车”.equals(类型)){
  返回的新车();
  }else if(“摩托车”.equals(类型)){
  返回新摩托车();
  }
  把新IllegalArgumentException(“请输入车类型”);
  }
  
  }/* *
  *交通工具
  */接口IVehicle {
  空运行();
  }/* *
  *汽车
  */类汽车实现IVehicle {
  
  @Override
  公共空间run () {
  System.out.println(“开汽车去....”);
  }
  }/* *
  *摩托车
  */类摩托车实现IVehicle {
  
  @Override
  公共空间run () {
  System.out.println(“骑摩托车去....”);
  }
  }
  
  课堂上小明{
  
  公共空间goToSchool (IVehicle车辆){
  System.out.println(“小明去学校”);
  vehicle.run ();
  }
  
  公共空间旅行(IVehicle车辆){
  System.out.println(“小明去旅游”);
  vehicle.run ();
  }
  
  }
   
  

上面代码看懂了么?小明家里有一个车库GarageFactory,里面放着汽车车和摩托车摩托车、小明要出去的时候,就到车库选择车,通过传递参数给GarageFactory.getVehicle(),指明要什么车,然后小明就骑着车出发了。

  

这个代码真正的术语叫:<强>简单工厂模式(简单工厂模式),也叫做<强>静态工厂模式。它是工厂方法中的一个实现方式,从字面理解就可以知道,它是最简单的工厂方法实现方式。它有一点点小缺陷,就是<强>扩展性不够好强,在上面代码中,小明只能骑摩托车或者开汽车,如果小明要骑单车出去呢?势必得在GarageFactory中添加如果是自行车的逻辑。这违反了哪条规则了?是不是那个<强>允许扩展,拒绝修改的开闭原则>   

不是说简单工厂这种实现方式不好,而是扩展性不够,在平时的开发中,简单工厂模式也用得不少。在这个小明家里车不多的情况下,用一个车库也是合适的。

  

工厂方法

  

小明老爸近几年赚了不少,车迷的两父子一直买的车,家里的车越来越多,这时候,他们决定多建几个车库,按车类型放置。比如,有一个汽车库,一个摩托车库。这时候小明要开汽车就去汽车库,要骑摩托车就去摩托车库。代码实现如下。

  
 <代码类="语言java ">公共类FactoryMethodTest {
  
  公共静态void main (String [] args) {
  小明小明=new小明();//小明骑摩托车去学校
  VehicleGarage motorcycleGarage=new motorcycleGarage ();
  IVehicle摩托车=motorcycleGarage.getVehicle ();
  xiaoMing.goToSchool(摩托车);//小明开汽车去旅游
  VehicleGarage carGarage=new carGarage ();
  IVehicle车=carGarage.getVehicle ();
  xiaoMing.travel(车);
  }
  
  }
  
  接口VehicleGarage {
  IVehicle getVehicle ();
  }/* *
  *汽车车库
  */类CarGarage实现VehicleGarage {
  
  @Override
  公共IVehicle getVehicle () {
  返回的新车();
  }
  }/* *
  *摩托车车库
  */类MotorcycleGarage实现VehicleGarage {
  
  @Override
  公共IVehicle getVehicle () {
  返回新摩托车();
  }
  }
  

创建型模式:工厂方法