初探设计模式(1)——工厂模式
从今天起,打算系统学习一下设计模式,先从工厂模式开始,本系列的文章只是对设计模式初步学习的总结,如有写的不对的地方欢迎指正。
什么是工厂模式呢?所谓工厂在我们的日常生活中就是生产产品的地方,如汽车工厂,玩具工厂等,在程序的世界中,设计到“生产产品”字眼的是什么?没错,就是创建对象!
“工厂”通俗来说就是一个创建对象(产品)的地方。工厂模式(Factory Pattern)是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个图看懂工厂模式:
以最近很火的共享单车为例,假如现在有个项目就是跟共享单车有关的,在开发这个项目的过程中需要获得所有共享单车的实例并且调用它们,我们一般的做法就是直接new一个共享单车就行了,这样做存在一个很致命的缺点,就是在创建对象的时候,通常要做一些初始化的操作,如果初始化的代码很长,说明在同一个方法中做的事情较多,相当于全部鸡蛋放在同一个篮子里,这种做法是很危险了,并且这样的代码封装性很差也不够优雅,如果把创建对象这个操作拆分开,只给调用者一个能获取到对象的接口,这样就能解决这个问题了。我们知道,接口是不能实例化的,怎么样获取接口的实例?创建一个工厂(获取接口实例的类)!调用者只需要从这个类中调用获取某种产品接口方法就能获取到接口的实例了,并且,这个工厂不仅仅能获取一种产品,如果要加入别的产品(如共享汽车),只需要再添加一个共享汽车的工厂类,并且暴露获取该接口实例的方法就行了,这样不但解决了"全部鸡蛋放在同一个篮子里",也提高了代码的封装性,并且提高了代码的扩展性。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
以下实现工厂模式的示例代码(以共享单车为例):
步骤1:创建一个共享单车接口
package com.cool.factoryPattern2; /** * 共享单车接口 * Created by hejin on 2017/3/30 0030. */ public interface SharedBicycle { /** * 踩单车 */ void ride(); }
步骤2:创建共享单车接口实现类
package com.cool.factoryPattern2; /** * OFO小黄车 * Created by hejin on 2017/3/30 0030. */ public class Bicycle_ofo implements SharedBicycle{ //IDEA小技巧:快速实现接口方法,在类定义行按Alt+Enter public void ride() { System.out.println("骑OFO小黄车很轻松就是找车麻烦满大街烂车..."); } }
package com.cool.factoryPattern2; /** * 摩拜单车 * Created by hejin on 2017/3/30 0030. */ public class Bicycle_mobike implements SharedBicycle{ public void ride() { System.out.println("骑摩拜单车犹如开坦克..."); } }
package com.cool.factoryPattern2; /** * 小鸣单车 * Created by hejin on 2017/3/30 0030. */ public class Bicycle_xiaoming implements SharedBicycle{ public void ride() { System.out.println("骑小鸣单车每次开锁都很麻烦很多故障车..."); } }
步骤3:创建生成共享单车的工厂
package com.cool.factoryPattern2; /** * 共享工厂,此工厂相当牛逼,可从此工厂获取任何你想获取的共享产品 * Created by hejin on 2017/3/30 0030. */ public class SharedFactory { /** * 获取共享单车 * @return */ public SharedBicycle getSharedBicycle(String bicycleName){ switch (bicycleName){ case "ofo": return new Bicycle_ofo(); case "mobike": return new Bicycle_mobike(); case "xiaoming": return new Bicycle_xiaoming(); } return null; } }
步骤4:创建一个调用工厂的类
package com.cool.factoryPattern2; /** * 共享世界(测试类) * Created by hejin on 2017/3/31 0031. */ public class SharedWorld { public static void main(String[] args) { //创建获取产品的工厂类 SharedFactory sharedFactory= new SharedFactory(); //获取ofo小黄车 SharedBicycle ofo = sharedFactory.getSharedBicycle("ofo");//IDEA小技巧:Alt+Enter自动补全代码 ofo.ride(); //获取mobike SharedBicycle mobike = sharedFactory.getSharedBicycle("mobike"); mobike.ride(); //获取小鸣单车 SharedBicycle xiaoming = sharedFactory.getSharedBicycle("xiaoming"); xiaoming.ride(); } }