工厂方法模式
工厂方法模式在简单工厂模式的基础上,为每个具体产品类提供一个对应的工厂类,每个工厂类实现工厂接口定义的公共方法创建具体的对象。工厂模式中角色包括:产品接口、产品类、工厂接口和工厂类。工厂模式通过多态实现,又称为多态工厂模式。客户端通过调用每个产品类对应的产品工厂来创建对象实例,同样是将对象创建和对象使用分离开来了。
解决的问题
1)简单工厂模式使用一个静态工厂方法创建所有产品,一旦这个工厂方法出现问题,所有的客户端(使用各个产品类的类)都会受到影响,工厂方法模式通过为每个产品类定义工厂方法创建产品避免了这种问题。
2)虽然引入了反射机制的简单工厂模式可以避免引入新产品时修改工厂方法,满足开闭原则,不过如果各产品类实例的初始化方法都不相同,势必又要添加逻辑判断,使这个工厂方法巨大无比,工厂方法模式通过为每个产品类定义工厂方法创建产品避免了这种问题。
工厂方法模式类图
以Fruit为产品接口,Apple、Orange和Banana是具体产品类,Factory是工厂接口,AppleFactory、OrangeFactory、BananaFactory是具体产品对应的工厂类。FactoryPattern是客户端。
具体实现
工厂方法模式的具体实现如下:
1 public class FactoryPattern { 2 public static void main(String[] args){ 3 IFactory fac=new AppleFactory(); 4 Fruit2 fru1=fac.createProduct(); 5 fru1.eat(); 6 IFactory fac2=new OrangeFactory(); 7 Fruit2 fru2=fac2.createProduct(); 8 fru2.eat(); 9 IFactory fac3=new BananaFactory(); 10 Fruit2 fru3=fac3.createProduct(); 11 fru3.eat(); 12 } 13 } 14 interface Fruit2{ 15 public abstract void eat(); 16 } 17 18 class Apple2 implements Fruit2{ 19 public void eat(){ 20 System.out.println("factory method pattern,eat apple"); 21 } 22 } 23 class Orange2 implements Fruit2{ 24 public void eat(){ 25 System.out.println("factory method pattern,eat orange"); 26 } 27 } 28 class Banana2 implements Fruit2{ 29 public void eat(){ 30 System.out.println("factory method pattern,eat banana"); 31 } 32 } 33 interface IFactory{ 34 public abstract Fruit2 createProduct(); 35 } 36 class AppleFactory implements IFactory{ 37 public Fruit2 createProduct(){ 38 return new Apple2(); 39 } 40 } 41 class BananaFactory implements IFactory{ 42 public Fruit2 createProduct(){ 43 return new Banana2(); 44 } 45 } 46 class OrangeFactory implements IFactory{ 47 public Fruit2 createProduct(){ 48 return new Orange2(); 49 } 50 }
优点
1)系统中添加新产品时,只需要添加对应的产品类和工厂类,相比于简单工厂模式中需要修改静态工厂的做法,更加符合开闭原则。
2)每个具体工厂类单独负责创建具体产品,既满足了不同产品初始化不同的情况,又避免了工厂方法出现问题导致系统中所有客户端收到影响的情况。
缺点
1)添加新产品时,需要同时添加产品类和对应的工厂类,当产品数量过多时,会增加系统的复杂度
2)在客户端里需要更换为另一种产品时,仍然需要修改实例化的具体工厂。
3)一个具体工厂只能创建一中具体产品。
参考: