学了几天的设计模式对设计模式颇有感触,虽然原来也多少了解过一些,但因为没有实际场景去应用,看过的也就渐渐的被遗忘,于是从头开始思考和学习后对面向对象有了更进一步的理解。
最开始学c的时候老师讲过c是一门面向过程的语言,简单理解为流程从上到下一步一步有序进行,而面向对象是在大二的时候学习java,当时还不太理解面向对象的好处,后来才慢慢理解面向对象实际是通过封装、继承、多态把程序的耦合度降低,有点类似传统的活字印刷术,这样让程序更容易修改,并且易于复用。
设计模式实际上都是前人在开发总结下来的经验于是进行提取变成了现在的设计模式,每种模式对应开发过程的一些特定情况的最佳实践,同时也起到了软件工程工程师之间沟通的“行话”,它不一定是通用的,但设计模式一定是解决这个场景最好的方式。
注意:具体场要景具体分析,一定场景下设计模式不一定是最好的
设计模式分类
- 创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)。
- 结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)等。
- 行为型模式,是从类或对象之间交互、职责划分等角度总结的模式。比较常见的行为模式有策略模式(Strategy)、解释器模式(Interpreter)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、访问者模式(Visitor)。
言归正传,简单工厂模式实际就是动态的帮我们创建对象,根据我在这里插入代码片们传入的不同参数生成不同的对象。
我们来实现一个运算器
运算器类
/**
* @author mosterRan
* @create 2018-11-14 下午8:24
*/
public class Operation {
private double numA = 0;
private double numB = 0;
public double getNumA() {
return numA;
}
public void setNumA(double numA) {
this.numA = numA;
}
public double getNumB() {
return numB;
}
public void setNumB(double numB) {
this.numB = numB;
}
public double GetResult(){
double result = 0;
return result;
}
@Override
public String toString() {
return "Operation{" +
"numA=" + numA +
", numB=" + numB +
'}';
}
}
加法类继承运算类
class OperationAdd extends Operation{
@Override
public double GetResult() {
double result = 0;
result = numA + numB;
return result;
}
}
减法类
class OperationSub extends Operation{
@Override
public double GetResult() {
double result = 0;
result = numA - numB;
return result;
}
}
乘法类
class OperationMul extends Operation{
@Override
public double GetResult() {
double result = 0;
result = numA * numB;
return result;
}
}
除法类
class OperationDiv extends Operation{
@Override
public double GetResult() {
double result = 0;
if(numB == 0)
try {
throw new Exception("除数不能为0");
} catch (Exception e) {
e.printStackTrace();
}
result = numA / numB;
return result;
}
}
简单运算工厂
/**
* @author zhr
* @create 2018-11-14 下午8:37
*/
public class OperationFactory {
public static Operation createOperation(String operate){
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}