【工厂方法模式】

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

【大话设计模式】工厂方法模式_工厂类

 

【简单工厂 与 工厂方法 比较】

【简单工厂的特点】简单工厂的工厂类中包含,包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

以计算器为例,在客户端只要把‘+’传给工厂,工厂就给出了相应的实例,客户端只要做运算即可。

【简单工厂的缺陷】但是,如果要增加一个功能,就需要在工厂类的方法里加分支条件,修改原有的类。

这就等于说,不但对拓展开放,而且对修改也开放,违背了开放-封闭原则。

【使用工厂方法】根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂实现这个接口。

这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂。

如果要增加新功能,只需要增加此功能的运算类和相应的工厂类。这样就符合开发-封闭原则。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂,所以工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。

【工厂方法的优点】工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但是增加了额外的开发量。

【简单工厂模式】实现计算类

class OperationFactory{
  public static Operation createOperate(String operate){
      Operation oper = null;
      swtich(operate){
        case "+":
           oper = new OperationAdd();
           break;
        case "-":
           oper = new OperationSub();
           break;
        case "*": 
           oper = new OperationMul();
           break;
        case "/":
           oper = new OperationDiv();
           break;
      }
      return oper;
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
Operation oper;
oper = OperationFactory.createOperate("+");
  • 1.
  • 2.

【工厂模式实现计算类】

public interface Ifactory{
  Operation CreateOperation();
}

public class AddFactory implements IFactory{
  @Override 
  public Operation CreateOperation(){
    return new OperationAdd();
  }
}
public class SubFactory implements IFactory{
  @Override 
  public Operation CreateOperation(){
    return new OperatioSub();
  }
}
public class MulFactory implements IFactory{
  @Override 
  public Operation CreateOperaton(){
    return new OperationMul();
  } 
}
public class DivFactory implements IFactory{
 @Override
 public OPeration CreateOperation(){
   return new OperationDiv();
 }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
IFactory operFactory = new AddFactory();
OPeration oper = operFactory.CreateOperation();
  • 1.
  • 2.