代码改变世界

java设计模式之一(简单工厂模式)

2018-07-17 15:43  Summer1218  阅读(162)  评论(0编辑  收藏  举报

运算类
public class Operation {


protected int numberA;

protected int numberB;


public double getReslut(){

double result=0;

return result;
}


public int getNumberA() {
return numberA;
}

public void setNumberA(int numberA) {
this.numberA = numberA;
}

public int getNumberB() {
return numberB;
}

public void setNumberB(int numberB) {
this.numberB = numberB;
}
}


------工厂类------
public class OperationFactory {

public static Operation createOperation(String type){

Operation oper=null;
switch(type){
case "+":
oper=new OperationAdd();
break;
case "-":
oper=new OperationDiv();
break;
default: break;
}
return oper;
}

}

-----加法运算类继承算法类----
public class OperationAdd extends Operation {

public double getReslut(){

double result=numberA+numberB;

return result;
}

}

----减法运算类继承算法类----
public class OperationDiv extends Operation {


public double getReslut(){

double result=numberA-numberB;
return result;
}
}

-----客户端代码---
@Test
public void GeneralTest() {

OperationFactory factory=new OperationFactory();

Operation oper= factory.createOperation("+");
oper.numberA=10;
oper.numberB=8;
double result=oper.getReslut();

System.out.println(result);
}

应用场景:

  当没有使用工厂模式的时候,每个“产品”类都是分散的,没有使用一个工厂接口把它们整合起来,而且,加入例子里面生产productA需要传入三个“原料”参数,使用者要清晰地知道这些参数才能把productA类实例化,每个产品参数不同的话,会让使用者非常凌乱,使用“工厂”则可以把参数封装在里面,让使用者不用知道具体参数就可以实例化出所需要的“产品”类。

优点:

将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,明确了职责。

把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则,面向接口编程,而不是面向实现编程。

缺点:

  1. 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  2. 要新增产品类的时候,就要修改工厂类的代码,违反了开放封闭原则(对扩展的开放,对修改的关闭)。
  3. 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。