简单工厂模式:
简单工厂模式并不是23种设计模式之一,因为他并不符合开闭原则主要目的是为了设计模式入门以及工厂方法模式,适合产品子类比较少的,创建操作比较简单的情况。
简单工厂的关键点如下:
1.定义一个static方法
2.使用抽象父类/接口作为方法的返回值
3.传入一个参数(一般是字符串参数)
4.方法内部根据传入的参数创建某个子类对象
优点>
客户端不负责对象的创建,而是由专门的工厂类完成;
客户端只负责对象的调用,实现了创建和调用的分离,降低了客户端的代码难度;
缺点>
如果增加和减少产品子类,需要修改简单工厂类,违背了开闭原则
如果产品子类过多,会导致工厂类非常庞大,违反了高内聚原则,不利于后期维护(一个工厂创建所有的子类产品)
适用情况>
所有的产品子类都有同一个父类(或接口),属于同一个产品系列
产品子类比较少的、创建操作比较简单
具体实现:
抽象类:
public abstract class Calculator {
protected int num1;//运算数1
protected int num2;//运算数1
//生成有参无参构造方法,getset方法
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public Calculator(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public Calculator() {}
/**
* 不同的运算,运算规则不同
* @return
*/
public abstract int calc();
}
继承:
public class AddCalculator extends Calculator {
public AddCalculator(int num1, int num2) {
super(num1, num2);
}
public AddCalculator() {
}
public int calc() {
return num1+num2;
}
}
class SubtractCalculator extends Calculator {
public SubtractCalculator(int num1, int num2) {
super(num1, num2);
}
public SubtractCalculator() {
}
public int calc() {
return num1-num2;
}
}
class MultractCalculator extends Calculator {
public MultractCalculator(int num1, int num2) {
super(num1, num2);
}
public MultractCalculator() {
}
public int calc() {
if(num2!=0){
return num1*num2;
}else{
throw new RuntimeException("除数不能是0");
}
}
}
class DivideCalculator extends Calculator {
public DivideCalculator(int num1, int num2) {
super(num1, num2);
}
public DivideCalculator() {
}
public int calc() {
return num1/num2;
}
}
工厂类:
public class CalcFactory {
public static Calculator getCalc(String type){
if("+".equals(type)){
return new AddCalculator();
}else if("-".equals(type)){
return new SubtractCalculator();
}else if("*".equals(type)){
return new MultractCalculator();
}else if("/".equals(type)){
return new DivideCalculator();
}else{
return null;
}
}
}
最后测试类:
public class CalculatorTest {
public static void main(String[] args) {
Calculator calculator = CalcFactory.getCalc("+");
calculator.setNum1(10);
calculator.setNum2(20);
int result = calculator.calc();
System.out.println(result);
}
}