一、实现方式:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
二、模式角色及其职责:
(1)工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
(2)抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
(3)具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
《大话设计模式》应用实例:使用面向对象的语言实现一个计算机控制台程序,要求输入两个数和运算符号,得到结果
/**
*Operation运算类
*/
public abstract class Operation {
private double numberA;
private double numberB;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
//得到运算结果
public abstract double getResult() throws Exception;
}
/**
* OperationAdd加法类
*/
public class OperationAdd extends Operation{
@Override
public double getResult() {
return getNumberA() + getNumberB();
}
}
/**
* OperationSub减法类
*/
public class OperationSub extends Operation{
@Override
public double getResult() {
return getNumberA() - getNumberB();
}
}
/**
* OperationMul乘法类
*/
public class OperationMul extends Operation{
@Override
public double getResult() {
return getNumberA() * getNumberB();
}
}
/**
* OperationDiv除法类
*/
public class OperationDiv extends Operation{
@Override
public double getResult() throws Exception{
if(getNumberB() == 0)
{
throw new Exception("除数不能为0!");
}
return getNumberA() / getNumberB();
}
}
/**
* OperationFactory运算工厂类
*/
public class OperationFactory {
public static Operation createOperate(String oper)
{
Operation operation = null;
//java7中已实现switch()变量类型为String
switch(oper)
{
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}
/**
* 测试类
*/
public class Test {
public static void main(String args[])
{
Operation operation = OperationFactory.createOperate("+");
operation.setNumberA(15);
operation.setNumberB(20);
try {
double result = operation.getResult();
System.out.println("得到的结果是:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}