工厂方法模式简谈

 图解工厂方法模式

包含的角色

Factory:抽象工厂

ConcreteFactoty:具体工厂

Product:抽象产品

ConcretePrduct:具体产品

优缺点

     优点:

                 在工厂方法模式中,工厂方法用来创关键客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化着一细节,用户只需要关心所需产品对应的工厂,无需创建细节,甚至无需知道具体产品类的类名。

                 基于工厂角色和产品角色的多态性设计师工厂方法模式的关键。他能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所以的具体工厂类都具有同一抽象父类。

                 在系统加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改你客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也变得非常好,完全符合“开闭原则”。

     缺点:

                 在添加新产品时,需要编写新的具体产品类和与之对应的具体工厂类,系统中的个数将成对增加,增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销;

                 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,而且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度;

目的

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且客服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

经典应用场景

jdbc连接数据库;

硬件访问;

降低对象的产生和销毁;

java的代码实现

public class ConcreteFactory extends Creator {
    public <T extends Product> T createProduct(Class<T> c){
                 Product product = null;
                 try {
                        product = (Product)Class.forName(c.getName()).newInstance();
                 } catch (Exception e) {
                        //异常处理
                 }
                 return (T)product;         
         }
}

总结

使用场景一般满足的条件:

1)一个类不知道他所需要的对象的类;

2)一个类通过其子类来指定创建哪个对象;

3)将创建对象的人物委托给多个工厂子类中的某一个,客户端在使用时可以无须关心哪一个工厂子类创建产品子类,需要时在动态指定。

猜你喜欢

转载自blog.csdn.net/Everywhere_Shipoars/article/details/84982857