学过spring和hibernate的应该都知道,这个模式在这俩框架里面被用的淋漓尽致,可以说看懂了spring和hibernate那么你会觉得new一个对象什么的简直是个low B。工厂方法的核心思想就是让别人去给我实例化对象,我只要你拿来给我用就行了,我作为调用者我就是牛逼 我管你实例化干了哪些事呢,我都不关心我只关心我用的爽不爽!那么这个专门用来实例化对象的东西就可以称之为工厂,由工厂生产对象~~~
具体看看工厂模式最佳实践:(现在满大街都在提倡什么面向接口编程,我就是要用抽象类!你咬我啊~~)
先规范化一个工厂规定工厂能干哪些事情,嗯,我们这个工厂是用来造人的!(这个相当于集团控股总部,不干事只出规章制度):
public abstract class AbstactHumanFactory { public abstract <T extends Human> T createHuman(Class<T> c); }
这个是真正的工厂了用来造人!那么具体要造什么人呢?我也不知道,我只知道我要造人类,你只要告诉我要造一个什么样的人类我就还你一个大活人。在java中就是通过类加载器实现的。(关于类加载器戳这→_→:http://blog.csdn.net/yanwushu/article/details/7574713)
public class HumanFactory extends AbstactHumanFactory { @Override public <T extends Human> T createHuman(Class<T> c) { Human human = null; try { human = (Human) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) human; } }
那么我怎么向你描述我要一个什么样的人呢?我总不能说:喂!内谁,给我造一个美女!这个是不现实的,工厂哪知道什么是美女。。。因此我们只能事先定义一个模版,把这个模版拿给工厂让他去批量生产人类,下面都是模版:
public interface Human { public void getColor(); public void talk(); }
public class WhiteMan implements Human { @Override public void getColor() { System.out.println("White"); } @Override public void talk() { System.out.println("WhiteMan"); } }
public class BlackMan implements Human { @Override public void getColor() { System.out.println("Black"); } @Override public void talk() { System.out.println("BlackMan"); } }
public class YelloMan implements Human { @Override public void getColor() { System.out.println("Yello"); } @Override public void talk() { System.out.println("YelloMan"); } }
OK,模版定义完成,下面我们就来造人了!
public class Test { public static void main(String[] args) { AbstactHumanFactory factory=new HumanFactory(); System.out.println("--create white man--"); Human whiteMan = factory.createHuman(WhiteMan.class); whiteMan.getColor(); whiteMan.talk(); System.out.println("--create black man--"); Human blackMan=factory.createHuman(BlackMan.class); blackMan.getColor(); blackMan.talk(); System.out.println("--create yellow man--"); Human yellowMan=factory.createHuman(YelloMan.class); yellowMan.getColor(); yellowMan.talk(); } }