工厂方法模式
Factory Method
工厂方法模式的意义在于定义一个创建产品对象的接口,将实际创建工作推迟到子类当中。好处:可以使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是对简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先,完全实现‘开-闭’原则,实现了可扩展。
其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法经常用在以下两种情况
1、对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体的工厂,生产出具体的产品来。java Collection中的iterator方法即属于这种情况(多态中的动态调用);
2、只是需要一个产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。
Factory Method
工厂方法模式的意义在于定义一个创建产品对象的接口,将实际创建工作推迟到子类当中。好处:可以使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是对简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先,完全实现‘开-闭’原则,实现了可扩展。
其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法经常用在以下两种情况
1、对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体的工厂,生产出具体的产品来。java Collection中的iterator方法即属于这种情况(多态中的动态调用);
2、只是需要一个产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。
(即用抽象父类或接口的对象类型去执行各种操作)
以Dao为例(java):
package factoryMethodModel;
import java.util.List;
//以dao来实例;
//dao可以用多种不同的实现
public interface Dao {
//模拟情况下只写一种方法
List<User> findAll()throws Exception;
}
package factoryMethodModel;
import java.util.List;
//jdbc实现
public class JDBCDaoimpl implements Dao{
public List<User> findAll() throws Exception {
//TODO
return null;
}
}
package factoryMethodModel;
import java.util.List;
//xml 实现
public class XMLDaoimpl implements Dao{
@Override
public List<User> findAll() throws Exception {
// TODO
return null;
}
}
package factoryMethodModel;
//工厂类用于生成具体实现类
//不考虑单例的情况下---具体可继续关注后续博客
public class Factory {
public static Object getInstance(String className) {
Object obj = null;
try {
obj = Class.forName(className).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return obj;
}
}
package factoryMethodModel;
import java.util.List;
// 测试类
public class Client {
public static void main(String[] args) throws Exception {
Dao dao = (Dao) Factory.getInstance("factoryMethodModel.XMLDaoimpl");
// 具体可用配置文件传递className
List<User> users = dao.findAll();
}
}