一、含义
简单工厂模式定义了一个“工厂类”,通过静态的方法根据需要生产相应的“具体产品”。
二、举个例子
2.1定义抽象产品类
/**
* 二元运算抽象类
*/
public abstract class Operator {
/**
* 操作数A
*/
protected double numberA;
/**
* 操作数B
*/
protected double numberB;
/**
* 设置操作数
* @param numberA
* @param numberB
*/
public void setNumbers(double numberA,double numberB){
this.numberA=numberA;
this.numberB=numberB;
}
/**
* 计算并返回运算结果
* @return 运算结果
*/
public abstract double getResult();
}
2.2定义多个具体产品类
/**
* 加法运算类
*/
class AddOperator extends Operator{
@Override
public double getResult(){
return super.numberA+super.numberB;
}
}
/**
* 加法运算类
*/
class SubOperator extends Operator{
@Override
public double getResult(){
return super.numberA-super.numberB;
}
}
/**
* 乘法运算类
*/
class MulOperator extends Operator{
@Override
public double getResult(){
return super.numberA*super.numberB;
}
}
/**
* 除法运算类
*/
class DivOperator extends Operator{
@Override
public double getResult(){
//这里需要有一个除0判断
return super.numberA/super.numberB;
}
}
2.3定义工厂类,通过静态方法获取具体产品类实例
public class OperatorFactory {
/**
* 简单工厂模式根据给出的运算符返回相应的运算类
* @param operator
* @return
* @throws Exception
*/
public static Operator getOperator(String operator) throws Exception{
switch(operator){
case "+":{
return new AddOperator();
}
case "-":{
return new SubOperator();
}
case "*":{
return new MulOperator();
}
case "/":{
return new DivOperator();
}
default:{
throw new Exception("不支持的运算符");
}
}
}
}
三、优缺点·
3.1优点
- 创建对象和使用对象解耦,使用者无需关注对象如何创建。
- 将创建具体对象的代码封装在工厂类中,便于代码维护。
3.1缺点
- 修改或增加创建具体产品的逻辑时需要修改工厂类代码,可扩展性差
- 创建产品的工厂方法为静态方法,不能被继承或重写,会造成工厂角色无法形成基于继承的等级结构。
四、使用场景
- 客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心;
- 需要创建的具体产品类较少。