文章首发
创建型模式:工厂方法
简介
<强>姓名强>:工厂方法
<强>英文名强>:工厂方法模式
<强>价值观强>:扩展是我的专属
<强>个人介绍强>:
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类实例化推迟到子类。(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类)。
(来自《设计模式之禅》)
你要的故事
还记得上一篇单例模式中的故事么?小明开着汽车去旅游,去学校,去聚会。这一次还是延续小明的故事,一个故事能讲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 () { 返回新摩托车(); } }创建型模式:工厂方法