工厂模式
简单工厂模式(也叫静态工厂模式)
简介
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延伸到子类。
UML类图
未完待续。。。
角色
- 抽象产品(接口或抽象类)
- 具体产品(继承或者实现都行)
- 工厂类(通过循环条件来new 哪个具体产品)
例子(以+-*/为例)
- 抽象产品
public abstract class Operation {
public abstract float getResult(float firstNumber, float secondNumber);
}
- 具体产品
public class SubOperation extends Operation {
@Override
public float getResult(float firstNumber, float secondNumber) {
return firstNumber-secondNumber;
}
}
public class MulOperation extends Operation {
@Override
public float getResult(float firstNumber, float secondNumber) {
return firstNumber*secondNumber;
}
}
public class DivOperation extends Operation {
@Override
public float getResult(float firstNumber, float secondNumber) {
return firstNumber/secondNumber;
}
}
- 工厂类
public class OperationFactory {
public static Operation getOperation(String quotaFlag){
Operation o = null;
// 通过条件判断类来决定哪个产品
switch (quotaFlag){
case "+" : o = new AddOperation();
case "-" : o = new SubOperation();
case "*" : o = new MulOperation();
case "/" : o = new DivOperation();
default:break;
}
return o;
}
}
- 应用程序
public class Computer {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入第一个数字:");
float firstNum = in.nextFloat();
System.out.println("请输入第二个数字:");
float secondNum = in.nextFloat();
System.out.println("请输入运算符号:");
String countQuato = in.next();
System.out.println(count(firstNum,secondNum,countQuato));
}
private static float count(float firstNum,float secondNum , String countQuota){
//通过工厂类获取对象
Operation operation = OperationFactory.getOperation(countQuota);
return operation.getResult(firstNum,secondNum);
}
}
缺点
产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑,这显然是违背开闭原则。
工厂方法模式
简介
简单工厂模式虽然解决了解耦问题。但如果要增加某个产品的时候,工厂类就必须对里面的条件进行修改。违反了对扩展开发,对修改关闭的原则。因此必须把工厂再抽象化出来。当有产生新产品的时候,就新建一个新的工厂来实现它。
角色
- 抽象产品
- 很多个具体产品
- 抽象工厂
- 很多个工厂
- 控制生产
例子(同样以加减乘除为例)
产品不变.和上面的相同。
1. 抽象工厂
public interface IFractory {
public Operation generateOper();
}
- 具体工厂
public class AddOperationFactory implements IFractory{
@Override
public Operation generateOper() {
return new AddOperation();
}
}
public class SubOperationFactory implements IFractory {
@Override
public Operation generateOper() {
return new SubOperation();
}
}
….
3. 应用程序
IFractory fractory = new AddOperationFactory();
Operation operation = fractory.generateOper();
operation.getResult(firstNum,secondNum);