简单工厂+反射机制改进抽象工厂模式

zhy

发布于 2020.02.28 20:09 阅读 2654 评论 0

抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

 

抽象工厂模式的主要优点如下:

1. 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;

2. 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

3. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。

4. 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

 

该模式的缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。  

 

模式结构图如下:

 

 

    当产品族中需要增加一个新的产品时(如Product3),所有的工厂类(AbstactFactory,ConcreteFactory1,ConcreteFactory2)都需要进行修改,这便是上面提到的抽象工厂模式的缺点。于是便有人提出用简单工厂+反射机制来改进抽象工厂模式。

 

    结构图如下:

 

 

 

 

     EazyFactory中使用了反射技术进行优化,使得程序由编译时变成了运行时。

 

public class EazyFactory
{
 
    private static String packName = "DesignPattern.abstractFactory";  //包名
    private static String number = "1";        
 
    public static Product1 newProduct1() throws Exception{
        String className = packName+"."+"ConcreteProduct1"+"number";    //构建一个需要实例化的类的路径
        return (Product1)Class.forName(className).newInstance();     //利用反射技术实例化类
    }
 
    public static Product2 newProduct2() throws Exception{
        String className = packName+"."+"ConcreteProduct2"+"number"; 
        return (Product2)Class.forName(className).newInstance();
    }
    public void setNumber(int number){
        this.number = number;
    }
}

 

    可以看出:当产品族中需要增加一个新的产品时,改进后的模式维护起来更加容易,只需在EazyFactory类中添加新的方法。