今天我们开始学习设计模式,从最简单的开始。
不知道从什么时候开始,我们已经不满足与我们写的平庸代码,感觉如此,事实如此。
设计模式的诞生是为了解决代码的可扩展性和维护性已经稳定性,有的人看了设计模式,只感觉平白添加了很多代码和类,这里我们要注意,类和代码不是无故添加的,各有各的职责,那么说到设计模式,我们就要明白面向对象,已经面对对象的三大原则:集成,封装,多态。
回头看看我们的程序,有多少代码符合呢,好了。现在开始讲解简单工厂模式。
工厂工厂,那自然是生产东西的地方,在我们这里就是生产代码或者类了,那为什么要生产呢,主要是为了应对不同的情况去做不同的处理,从计算器开始说,让我们写一个计算器,我们一般会写一个计算类和主类就完事了,但是如果我们要添加更多计算业务怎么办,那么我们就要不断在这个计算类中进行改动,这个类就会变成越来越复杂,越来越长,重要的是不好维护,不经意间就会出现意想不到的错误,那么针对这个问题,我们就要将问题拆分,这里我们的工厂就是计算类,那么生产的就是计算的算法,算法有:加法,减法,乘法,除法…,这里的算法我们就可以写成一个个类,并且都集成最基本的算法类:
/**
* 运算基类
*/
public interface BaseOperation<T, A, B> {
T operation(A a, B b);
}
那么一个简单的减法算法类怎么写呢,上代码:
public class AdditionOperation implements BaseOperation<Double, Double, Double>{
@Override
public Double operation(Double o, Double o2) {
return o + o2;
}
}
代码简洁易懂,就是单单的一个加法过程,有人问了,这么简单的一个过程,有必要还去弄一个类,这么大费周章的至于么。这就是我们的设计思想,为了便于扩展,我们只写了加减乘除,四个算法,但是要是日后我们还需要添加另一种算法咋办,再在你的那个大类里面写么?要是更多的算法呢?所以说不要只看到当前的小格局。
写好了一个加法的算法类,那么我们怎么用到它呢,这时候我们的算法生产工厂就该登场了,先看看:
public class OperationFactory {
private ArithmeticSymbol opration;
private Double result;
public OperationFactory(ArithmeticSymbol opration){
this.opration = opration;
}
public Double getResult(Double a, Double b){
switch (opration){
case Addition: //加法
result = new AdditionOperation().operation(a, b);
break;
case Subtraction: //减法
result = new SubtractionOperation().operation(a, b);
break;
case Multiplication: //乘法
result = new MultiplicationOperation().operation(a, b);
break;
case Divisi: //除法
result = new Division().operation(a, b);
break;
}
return result;
}
//代表加减乘除的几个枚举值
public enum ArithmeticSymbol{
Addition, Subtraction, Multiplication, Divisi
}
}
当我们使用不同的枚举值去代码不同的算法的时候,这个工厂就会提供不同的运算结果,这样的话我们和把所有的东西写在一个类里面相比,如果添加一种算法,我们只需要添加新的算法类和在这个工厂里面添加一个switch分支即可,好处是不会影响到其他任何的算法,思路清晰,不容易出错,扩展性很强。
写好了算的部分,下面就是使用了,上代码:
OperationFactory operationFactory = new OperationFactory(Addition);
Log.d("OperationResult", operationFactory.getResult(1.0, 2.0) + "");
首先声明算法的种类,是加法,其次提供数据,直接给出结果,我们仔细观察看会发现什么,虽然我们前面写的很多类,但是到了这里我们只需要使用到一个类,那就是这个算法生产工厂,操作简单,代码游戏,还不快来学习!
源码奉上:https://gitee.com/wanxuedong/SheJiMoShi-JianDanGongChangMoShi/tree/master