Java设计模式—工厂方法模式

工厂方法模式是对简单工厂方法模式的改进,在学习工厂方法模式以前,我们首先来复习一下简单工厂模式。
简单工厂模式使用一个简单工厂类,里面有一个静态的方法根据传入的参数动态的创建具体对象,简单工厂类封装了创建具体对象的过程,客户端只需要调用简单工厂类中的静态工厂方法,传入参数就可以创建得到自己需要的对象。
看看简单工厂的模式结构:
Factory(简单工厂类):里面有一个静态方法用于创建具体产品对象。
Product(抽象产品类):它是工厂类创建的所有对象的父类,封装了所有产品的公共方法。
ConcreteProduct(具体产品角色):它是工厂类创建的目标对象,可以有多个具体产品对象,静态工厂方法就会根据传入的参数来动态的创建对应于参数的对象。下图是结构图:
Java设计模式—工厂方法模式
但是设想,如果我们要增加一个ConcreteProductC,应该怎么办?是不是需要创建一个ConcreteProductC类,继承自Product类,然后就得修改简单工厂类中静态方法,增加一个switch语句中的case分支了,这样不就不符合开放-封闭原则了吗。因此,工厂方法模式就应运而生了,工厂模式为每一个具体的产品类都创建一个具体的工厂类,然后为这些具体的工厂类创建一个工厂父类来定义具体工厂类中的公共方法。下面来看工厂方法的模式结构:
Product(抽象产品):和简单工厂类的Product类一样。
ConcreteProduct(具体产品类):和简单工厂类的ConcreteProduct类也一样。
Factory(抽象工厂类):抽象工厂类是所有具体工厂类的父类,声明了工厂方法,但是没有实现。
ConcreteFactory(具体工厂类):它是抽象工厂类的子类,实现了抽象工厂类中定义的工厂方法,返回一个具体产品类的实例,但是是针对Product接口编程的,将具体产品向上转型为抽象产品。
结构图如下:
Java设计模式—工厂方法模式
下面来回顾下刚才的问题:如果要增加一个具体产品类怎么办?
那就创建一个具体产品类继承自Factory,然后创建一个具体工厂类用于创建新的具体产品类的对象,新的具体工厂类继承自Product。这样就可以不修改代码,符合开放—封闭原则。