转自:http://seekereye.iteye.com/blog/446688
所谓的工厂模式是通过向这个工厂提供一些“原材料”,然后工厂就可以生产出相应的“产品”的一种模式。在Java中所具体对应的是:通过提供一个类,然后生产出对象的模式;当然也可以提供其他的东西而生产出另外一种东西。不管提供什么、生产什么,主要的是工厂本身,工厂的作用。在Java编程中工厂模式很有用,也很常用,实现起来也不难;在实现时需要结合一些东西,如反射、单例等,下面是一个简单的例子:
1、定义一个接口。接口可以多实现,很容易实现多态,很有好处;
- public interface DAOIf{
- void test();
- }
接口中随意定义了一个方法,一般人都知道实现这个接口的具体类要实现接口中方法。
2、这里再定义两个实现上述接口的具体类,也就是具有相同业务逻辑的类,使用时可以随意切换;
- public class DAOimpl1 implements DAOIf{
- public void test(){
- System.out.println("this is implement1");
- }
- }
- public class DAOimpl2 implements DAOIf{
- public void test(){
- System.out.println("this is implement2");
- }
- }
3、写一个用于反射具体类的工厂,而反射时只需反射出具体类的一个实例,所以要用到单例模式。如 果在切换实现类时不想修改源代码,可以把类名写在配置文件中,然后读出来即可;
工厂的写法有两种:一种是饿汉式,一种是懒汉式。
饿汉式:
- public class DAOFactory {
- private static Properties pro;
- private static DAOIf dao;
- static {
- pro = new Properties();
- try {
- FileInputStream fis = new FileInputStream("DAO.config");
- pro.load(fis);
- String clsName = pro.getProperty("implClasse");
- Class cls = Class.forName(clsName);
- dao = (DAOIf) cls.newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // 负责向外界返回dao的实例
- public static DAOIf getDao() throws Exception {
- return dao;
- }
- }
可以看到,之所以称为饿汉式是因为对象在程序初始化时就在静态代码中被创建,而不管使用者是否使用它。程序中的"DAO.config"是一个存储有类名信息的配置文件。
懒汉式:
- public class DAOFactory {
- private static Properties pro;
- private static DAOIf dao;
- static {
- pro = new Properties();
- try {
- FileInputStream fis = new FileInputStream("DAO.config");
- pro.load(fis);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // 负责向外界返回dao的实例
- public static DAOIf getDao() throws Exception {
- if (dao == null) {
- String clsName = pro.getProperty("implClasse");
- Class cls = Class.forName(clsName);
- dao = (DAOIf) cls.newInstance();
- }
- return dao;
- }
- }
懒汉式中只有当调用了返回实例的方法时对象才会被创建;
两种写法都只创建一个实例,所以都是单例的;单例可以节约资源。
DAO.config配置文件的具体内容为:implClasse=DAOimpl1;这里的实现类可任意切换。这样工厂就基本完成。在使用时工厂就会根据配置文件所提供的实现类反射出对象,而我们如果要切换实现类,只需要修改一下配置文件即可,但不需要修改源代码。这样做的好处是,哪个实现类好我们就用哪个,方便移植。
由此看到工厂模式很灵活,也很好用,在编程时如果用得上工厂模式都应该使用。