上一篇简单工厂模式,如果扩展新的产品类,需要修改工厂类源代码,不符合开闭原则,工厂方法模式通过对工厂类进行抽象,很好的解决了这个问题。
工厂方法模式UML类图如图所示:
说明:具体产品继承抽象产品,具体工厂继承抽象工厂,具体工厂依赖具体产品。
具体实例代码如下所示(其实是在简单工厂模式实例代码的基础上对工厂类进行了一下抽象):
抽象工厂类:
public abstract class AbstractFactory {
public abstract Product getProduct();
}
具体产品A工厂类:
ublic class ProductAFactory extends AbstractFactory{
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return new ProductA();
}
}
具体产品B工厂类:
public class ProductBFactory extends AbstractFactory{
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return new ProductB();
}
}
抽象产品类:
public abstract class Product {
//公共方法
public void sameMethod(){
System.out.println("我是公共方法!");
}
//定义抽象方法
public abstract void diffMethod();
}
具体产品类A:
public class ProductA extends Product{
@Override
public void diffMethod() {
System.out.println("A产品的方法!");
}
}
具体产品类B:
public class ProductB extends Product{
@Override
public void diffMethod() {
// TODO Auto-generated method stub
System.out.println("B产品方法!");
}
}
Main类:
public class Main {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class facrotyClazz = Class.forName(ReadProperties.readProperties("factory_name"));
AbstractFactory factory = (AbstractFactory)facrotyClazz.newInstance();
Product product =factory.getProduct();
product.sameMethod();
product.diffMethod();
}
}
说明,Main类主方法利用反射技术从配置文件读取信息,生成工厂实例。
工厂方法模式说明:
工厂方法模式面向抽象的工厂类进行编程,将具体产品类的实例化延迟到工厂子类中完成,如果想修改生产的产品,修改配置文件中的具体工厂配置就可以,此模式,一个具体工厂类对应一个具体产品,如果生产新的产品C的话,完全不用修改源代码,只要添加一个ProductCFactory类和一个ProductC类就行,修改一下配置文件中的具体工厂类配置,就可以生产C产品。
该模式中属于运行期才确定new哪个对象,所以使用反射技术生成工厂类很容易达到目的。
该模式有一个缺点就是,如果扩展产品的话,还要扩展一个相对应的具体产品工厂,类的个数成对增加。
如有问题,欢迎指正
end

本文介绍了工厂方法模式,通过抽象工厂类解决简单工厂模式扩展性不足的问题。具体实现中,每种产品都有对应的工厂类,通过配置文件指定具体工厂,利用反射技术创建实例。
--工厂方法模式&spm=1001.2101.3001.5002&articleId=75040918&d=1&t=3&u=4ba2af6b8488488d8a2593c8b9072bbb)
920

被折叠的 条评论
为什么被折叠?



