已经好久没有写博客了,今天写一篇用的比较多的设计模式之一的工厂模式,首先说说工厂模式的原理。
对于工厂我们肯定很熟悉了,在java中也有很多的运用工厂模式的地方,比我们刚开始学习jdbc连接数据库的时候我们可以通过给给不同驱动的名字可以获取不同的连接,可以获取不同的数据库的连接对象。
这里以生活中的工厂作为例子,比如我们有一个工厂可以生产不同品牌的衣服,比如香奈儿,纪梵希,范思哲,当然这些工厂只是代理拿衣服,并不会真正的去生产这些衣服,生产这些衣服的是香奈儿,纪梵希,范思哲这三个衣服工厂,但是我们只需要给这个工厂说我需要什么样的即可,不用每一家工厂店单独跑一次。就可以拿到相应的衣服了。
对应到我们的代码中就是需要创建三个类,这三个类分别是香奈儿,纪梵希,范思哲的类,我们同时需要有一个工厂类去管理获取这三个类,但是因为三个类会返回三个不同的类对象,所以我们就应该想返回的应该是一个三个类共同的父类或者接口或者Object。这里一般用接口的比较多,个人认为原因如下
Object:不便于表明所需要的东西,写Object是无所谓,但是总觉得怪怪的,我没有这样试过,有想法的同学可以试试。
SuperClass:不用父类的原因是因为在java中只能是单继承,一旦使用了就不能继承其他的类了,这样缺陷比较多。
Interface:使用接口的形式我们可以无限制的实现接口,当然这有些夸张了,在使用工厂类的时候还是使用一个接口最好。
所以在使用功能工厂模式的时候需要父接口,实现子类,管理工厂的类(必不可少)
Common Interface:
public interface CloseInterface { void ColseFunction(); }
public class Chanel implements CloseInterface {//CHANEL的实体类 @Override public void ColseFunction() { System.out.println("Chanel"+"Chanel的衣服"); } }
public class GivenChy implements CloseInterface {//GivenChy的实体类 @Override public void ColseFunction() { System.out.println("GivenChy "+"GivenChy的衣服"); } }
public class Versace implements CloseInterface {//Versace的实体类 @Override public void ColseFunction() { System.out.println("Versace"+"Versace的衣服"); } }
public class CloseFactory {//第一种获取对象的方法 public static CloseInterface getClose(String type){ if("CHANEL".equals(type)){ return new Chanel(); }else if("VERSACE".equals(type)){ return new Versace(); }else if("GIVENCHY".equals(type)){ return new GivenChy(); } return null; } }
public class ReflexFactory {//第二种获取对象的方法 public static <T> T getClose(Class<? extends T> clazz){ T obj=null; try{ obj=(T)Class.forName(clazz.getName()).newInstance(); }catch (ClassNotFoundException | InstantiationException |IllegalAccessException e){ e.printStackTrace(); } return obj; } }在上述的获取对象的管理工厂的类有两种呀,一种就是普通的,一种是通过反射的方式来获取对象,我们在实际工作中还是会通过反射的方式比较好,因为当我们增加一类衣服的时候,如果要使用第一种的方法获取就需要增加一个判断,这样麻烦,而且最主要是每次增加一个类都要这样,如果项目在一个文件夹下还好,不在一个文件夹中有可能会忘记。通过第二种的方式我们通过反射在jvm中的让jvm在编译执行的过程中自己根据提供的类全名来获取相应的对象,这也是除了构造函数获取对象的方法之一。