在编程中难免会遇到很多重复的操作,如果重复的去cv代码当时你会觉得简单省时间,但是如果后期大量变更需求,增加新功能。你会发现你需要花大量的精力和时间去更改之前大量的重复代码。到最后发现程序臃肿不堪,乱作一团,甚至都想重新写。所以良好的编码习惯能为我们节省大量时间同时提高编程能力,写出让人赏心悦目的代码。
很多语言大部分都继承了三大特点,封装、继承、多态,因此我们可以在这三个基础上让代码具备易扩展、易维护、易复用的特点。
假如现在有一个算法类
**
* 算法类
*/
public class Count {
//加法
public int add(int a, int b) {
return a + b;
}
//减法
public int subtraction(int a, int b) {
return a - b;
}
}
我们把算法封装在一个类里通过new去调用对应的计算,看着目前代码觉得挺简单也比较一目了然。但是这时候如果增加新的计算 在增加一个乘法运算 我们就需要在类里面增加乘法计算
/**
* 算法类
*/
public class Count {
//加法
private int add(int a, int b) {
return a + b;
}
//减法
private int subtraction(int a, int b) {
return a - b;
}
//乘法
public int multiplication(int a, int b) {
return a * b;
}
}
这时候类里面的方法还算好,但是如果我们在增加除法、开根、平方等计算。就会发现这个类越来越臃肿,耦合度也高。而且每一次的变更都需要对此类做修改这是很不好的,我们应该把每一个计算的方式独立,不相互依赖。修改加法时我们只需要更改加法的,别的计算方式对于我们来说完全不可见,我们只需要关注其中的一点就可以了。
这时候我们可以使用工厂模式来改变代码的结构,使用工厂模式需要用到继承、多态 这两大特点。
我们可以先建立一个父类,这个类中有一个计算的方法
//可以是抽象 也可以是接口
public class CountParent {
public int a;
public int b;
public int count() {
return 0;
}
}
然后在写对应计算方法类
public class Add extends CountParent {
@Override
public int count() {
a = 12;
b = 19;
return a + b;
}
}
这里为了方便我直接写数值,减法等类似写法。这样我们就将对应的计算分开了,每个都是独立的存在,当你修改加法 你也只能看到加法的计算。不会牵涉别的计算方法。有了各种计算方式后我们就要考虑如何使用了。有些人可能会直接new对应的计算类当然这样也可以,但是如果频繁使用的话,就得频繁去new了。当出现这种情况的时候我们就可以使用工厂模式了,让工厂为我们生产对应的类,这样我们就不需要频繁去自己写new了。
public class CountFactory {
public static CountParent getCountParent(String type) {
CountParent countParent = null;
switch (type) {
case "+":
countParent = new Add();
break;
case "-":
countParent = new Subtraction();
break;
}
return countParent;
}
}
直接造一个工厂类,通过不同的计算符号去生产对应的计算类,这里就运用到了多态。
在使用的时候就取代了频繁new的情况
//现在使用方式
CountFactory.getCountParent("+").count()
//之前调用方式
new Add().count();
new Subtraction().count();
我们只需要更改对应计算符号即可,使用起来也更方便,不需要考虑怎么实现,只需要关注对应的计算符号。
当我们需要频繁去new一个类的时候,我们就可以使用工厂模式去造这个类。使用工厂模式需要了解继承和多态以及使用。模式虽好,但不能乱用。