工厂模式
2020-03-08 本文已影响0人
GeekerLou
工厂模式
问题:
- 工厂模式分为几类?
- GOF 23种设计模式中,工厂方法模式和抽象工厂模式有什么区别?
- 不在GOF 23种设计模式中的简单工厂模式是什么?
- 简单工厂模式、工厂方法模式和抽象工厂模式各自解决什么问题?有什么不同?
分类
- 简单工厂
- 工厂方法
- 抽象工厂
三种工厂模式对比
简单工厂模式的优缺点
优点:
- 屏蔽产品的具体实现,调用者只关心产品的接口。
- 实现简单
缺点:
- 增加产品,需要修改工厂类,不符合开放-封闭原则
- 工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则
工厂方法模式的优缺点
优点:
- 继承了简单工厂模式的优点
- 符合开放-封闭原则
缺点:
- 增加产品,需要增加新的工厂类,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
抽象工厂模式的优缺点
优点:
- 隔离了具体类的生成,使得客户并不需要知道什么被创建
- 每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;
缺点
- 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
精华总结(记忆)
- 简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,主要是新增产品,就要修改工厂类。符合单一职责原则。不符合开放-封闭原则)
- 工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品,新增产品时不需要更改已有的工厂,需要增加该产品对应的工厂。符合单一职责原则、符合开放-封闭原则。但是引入了复杂性)
- 抽象工厂 :用来生产不同产品族的全部产品。(增加新产品时,需要修改工厂,增加产品族时,需要增加工厂。符合单一职责原则,部分符合开放-封闭原则,降低了复杂性)
最后,三种工厂模式各有优缺点,没有最好的,只有最合适的!
示例
公共类
Operation.java
public abstract class Operation {
private double value1 = 0;
private double value2 = 0;
public double getValue1() {
return value1;
}
public void setValue1(double value1) {
this.value1 = value1;
}
public double getValue2() {
return value2;
}
public void setValue2(double value2) {
this.value2 = value2;
}
public abstract Double calculateResult();
}
OperationAdd.java
public class OperationAdd extends Operation {
@Override
public Double calculateResult() {
return getValue1() + getValue2();
}
}
OperationDiv.java
public class OperationDiv extends Operation {
@Override
public Double calculateResult() {
if (getValue2() != 0) {
return getValue1() / getValue2();
} else {
return null;
}
}
}
OperationMul.java
public class OperationMul extends Operation {
@Override
public Double calculateResult() {
return getValue1() * getValue2();
}
}
OperationSub.java
public class OperationSub extends Operation {
@Override
public Double calculateResult() {
return getValue1() - getValue2();
}
}
简单工厂模式示例
/**
* 操作方法的工厂类
*
* 含有一定的商业逻辑和判断逻辑,例如switch...case...分支判断。在java中它往往由一个具体类实现
*/
public class OperationFactory {
public static Operation createOperation(String operation) {
Operation oper = null;
switch (operation) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
default:
throw new UnsupportedOperationException("不支持该操作");
}
return oper;
}
}
工厂方法模式示例
/**
* 工厂接口
*/
public interface IFactory {
Operation CreateOperation();
}
/**
* 加法类工厂
*/
public class AddFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationAdd();
}
}
/**
* 减法工厂类
*/
public class SubFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationSub();
}
}
/**
* 乘法工厂类
*/
public class MulFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationMul();
}
}
/**
* 除法工厂类
*/
public class DivFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationDiv();
}
}
抽象工厂模式示例
(TODO)