定义: 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
解决问题:解决如何实例化对象的问题,根据不同的场景实例化不同的对象
核心思想:用一个专门的类来进行对象的实例
特性:封装、多态
特点:易维护、易扩展、易复用
结构图:
包含的角色:
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
在具体使用过程中,需求判断具体产品是否有相同的逻辑,没有则使用接口扮演抽象产品的角色,如果有共同的逻辑部分,则使用抽象类进行,共同的东西应该要抽取出来的。
使用场景及代码实现:
需求:实现一个简单的计算器
具体分析:计算器包含有加、减、乘、除,可以抽象为一个操作类,每个具体继承操作类,进行各自具体操作的实现。最主要的核心问题就是实例不同的操作对象,所有用到简单工厂模式。
工厂角色:
public class OperationFactory {
public static Operation createFactory(String operator) {
Operation operation = null;
switch (operator) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperatinSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperatinDiv();
break;
default:
break;
}
return operation;
}
}
抽象角色:
public 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 double result() {
double result = 0;
return result;
}
}
具体角色:
public class OperationAdd extends Operation{//加
@Override
public double result() {
return getNumberA()+getNumberB();
}
}
public class OperationMul extends Operation{//乘
@Override
public double result() {
// TODO Auto-generated method stub
return getNumberA()*getNumberB();
}
}
public class OperatinDiv extends Operation{//除
@Override
public double result() {
return getNumberA()/getNumberB();
}
}
public class OperatinSub extends Operation{//减
@Override
public double result() {
// TODO Auto-generated method stub
return getNumberA()-getNumberB();
}
}
测试代码:
public class SimpleFactoryTest {
public static void main(String[] args) {
double numberA = 0;
double numberB = 0;
String operate = null;
System.out.println("请输入numberA:");
Scanner scanner = new Scanner(System.in);
if(scanner.hasNextDouble()) {
numberA = scanner.nextDouble();
}
Scanner scanner1 = new Scanner(System.in);
System.out.println("请输入操作符:+,-,*,/:");
if (scanner1.hasNextLine()) {
operate = scanner1.nextLine();
}
Scanner scanner2 = new Scanner(System.in);
System.out.println("请输入numberB:");
if(scanner2.hasNextDouble()) {
numberB = scanner2.nextDouble();
}
Operation operation = OperationFactory.createFactory(operate);
operation.setNumberA(numberA);
operation.setNumberB(numberB);
System.out.println(operation.result());
}
}
注:案例出自《大话设计模式》