【设计模式】1.简单工厂模式

前言

代码例子是来大话设计模式,本文主要是根据个人的理解,对书中的内容做学习笔记。

基础遗忘了可以复习一下:
面向对象Java基础
简单了解UML类图

1、业务背景

做一个计算器

2、UML与代码

这里不在复述书中的提炼过程,直接讲模式,UML和代码。

2.1 封装业务

我们需要加减乘除四种运算,然后又能知道,他们唯一的区别是符号不同【提炼业务逻辑的相同部分】,为了避免高耦合,我们对每种运算做封装。

  • 记录:
    继承是自底向上抽象出来的,我们应该
    1.想加减乘除的业务方法并提炼,得到Operation类的方法
    2.根据Operation的方法,封装各个业务逻辑类,并继承Operation

运算类:

public abstract class Operation {
    
    
	public double getResult(double numberA, double numberB){
    
    
		return 0d;
	}
}

加减乘除类:

public class Add extends Operation{
    
    
	public double getResult(double numberA, double numberB){
    
    
		return numberA + numberB;
	}
}
public class Sub extends Operation{
    
    
	public double getResult(double numberA, double numberB){
    
    
		return numberA - numberB;
	}
}
public class Mul extends Operation{
    
    
	public double getResult(double numberA, double numberB){
    
    
		return numberA * numberB;
	}
}
public class Div extends Operation{
    
    
	public double getResult(double numberA, double numberB){
    
    
		return numberA / numberB;
	}
}

在这里插入图片描述

2.2 简单工厂模式实现

考虑一个问题:到底要实例化谁,将来会不会增加实例化对象。
例如增加指数运算,这就是容易变化的地方,应该用一个单独的类来做这个创造实例的过程,这就是工厂

简单运算工厂类:

public class OperationFactory {
    
    
	
	public static Operation createOperation(String operate){
    
    
		Operation oper = null;
		switch (operate) {
    
    
			case "+":
				oper = new Add();
				break;
			case "-":
				oper = new Sub();
				break;
			case "*":
				oper = new Mul();
				break;
			case "/":
				oper = new Div();
				break;
		}
		return oper;
	}
}

在这里插入图片描述

客户端代码:

	double nemberA = Double.parseDouble(sc.nextLine());
	String strOperate = sc.nextLine();
	double nemberB = Double.parseDouble(sc.nextLine());
	
	// 主程序访问的入口
	Operation oper = OperationFactory.createOperate(strOperate);
	double result = oper.getResult(numberA,numberB);

如果需要改动业务,客户端代码不用改变,只需要改OperationFactory里面,对于某一业务也可以针对性的改,不会对其他部分造成影响。
在这里插入图片描述

3、总结

  • 该模式只解决对象创建的问题(工厂创建对象)
  • 工厂类是把要用的子类,在工厂类中根据情况new好

猜你喜欢

转载自blog.csdn.net/weixin_42516475/article/details/131704071