简单工厂模式
来源:互联网 发布:三维测量的算法 编辑:程序博客网 时间:2024/05/16 10:36
在团队开发过程中,写出优雅的代码是一件很重要的事情,这就要求在写码时,注重代码的可读性,可扩展性和灵活性等等;因此熟练运用设计模式是一个优秀程序员必须要掌握的技能。最近又回过头来认真看《大话设计模式》一书,对其中内容的理解也的确和第一次草草阅读完全不一样了。所以计划整理一下,将自己对每种模式的理解写成学习笔记。
面向对象编程很重要的三点就是“封装”,“继承”和“多态” 的灵活运用;这三点是保证代码低耦合非常重要的因素。比如在写android时,在我的理解中,从大的方面讲写android 无非就是在做两件事,一个是数据处理,一个是数据展现;所以一个好的app的业务代码一定保证了数据处理和数据展现这两者的低耦合。
因此,为了能做到上述的代码的灵活性, 可扩展性以及低耦合性等等,许许多多的优秀的设计模式就应运而生了。
今天抽空把 “简单工厂模式” 以 android 小程序的形式实践了一下。简单理解就是创建一个唯一的调度类来管理多态,比如实际生活中很多餐厅服务员在给顾客点菜时用的点菜宝 就是这么一个调度中心,点菜宝用过简单输入菜名来启动这道菜的制作流程,做完后由服务员端上给顾客即可,服务员并不需要知道这道菜是如何制作加工的。
每一个计算类,都继承自一个计算基类,代码如下:
工程结构截图如下:
面向对象编程很重要的三点就是“封装”,“继承”和“多态” 的灵活运用;这三点是保证代码低耦合非常重要的因素。比如在写android时,在我的理解中,从大的方面讲写android 无非就是在做两件事,一个是数据处理,一个是数据展现;所以一个好的app的业务代码一定保证了数据处理和数据展现这两者的低耦合。
因此,为了能做到上述的代码的灵活性, 可扩展性以及低耦合性等等,许许多多的优秀的设计模式就应运而生了。
今天抽空把 “简单工厂模式” 以 android 小程序的形式实践了一下。简单理解就是创建一个唯一的调度类来管理多态,比如实际生活中很多餐厅服务员在给顾客点菜时用的点菜宝 就是这么一个调度中心,点菜宝用过简单输入菜名来启动这道菜的制作流程,做完后由服务员端上给顾客即可,服务员并不需要知道这道菜是如何制作加工的。
同样,本例中以一个计算器为例,也是以简单工厂模式来实现的。
主界面如上图所示就是一个简单的计算界面。MainActivity 的代码如下:
public class MainActivity extends Activity { private EditText editTextNum1; private EditText editTextNum2; private Spinner spinnerOperator; private Button btnCalculate; private TextView txtResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView(){ editTextNum1 = (EditText) findViewById(R.id.num1); editTextNum2 = (EditText) findViewById(R.id.num2); spinnerOperator = (Spinner) findViewById(R.id.operate_spinner); btnCalculate = (Button) findViewById(R.id.btn_calculate); txtResult = (TextView) findViewById(R.id.txt_result); btnCalculate.setOnClickListener(new OnBtnCalculateOnClickListener()); } class OnBtnCalculateOnClickListener implements View.OnClickListener{ @Override public void onClick(View view) { txtResult.setText(getCalculateResult()); } } public String getCalculateResult(){ int num1 = 0; int num2 = 0; String operator = "+"; if(editTextNum1 != null) { num1 = Integer.valueOf(editTextNum1.getText().toString().trim()); } if(editTextNum2 != null) { num2 = Integer.valueOf(editTextNum2.getText().toString().trim()); } if(spinnerOperator != null){ operator = (String) spinnerOperator.getSelectedItem(); } Calculate calculate = CalculateFactory.getCalculateType(MainActivity.this, operator); if(calculate == null){ return "operator error"; } calculate.num1 = num1; calculate.num2 = num2; return calculate.getResult(); }}
可见MainActivity 中 函数 getCalculateResult 中的CalculateFactory类 就是一个计算类型工厂,我只需要传入运算符即可得到对应运算符的运算结果。
CalculateFactory类 代码如下,比较容易理解:
public class CalculateFactory { public static Calculate getCalculateType(Context context, String operator) { Calculate calculate = null; switch (operator) { case "+": calculate = new AddCalculate(context); break; case "-": calculate = new SubtractCalculate(context); break; case "*": calculate = new MultiplyCalculate(context); break; case "/": calculate = new DivideCalculate(context); break; case "^": calculate = new ExponentCalculate(context); break; default: break; } return calculate; }}
每一个计算类,都继承自一个计算基类,代码如下:
public class ExponentCalculate extends Calculate { public ExponentCalculate(Context context) { super(context); } @Override public String getResult() { if (num1 == 0) { Toast.makeText(contextWeakReference.get(), "num1 is illegal in ExponentCalculate", Toast.LENGTH_SHORT).show(); return "number entered illegal"; } else if (num2 == 0) { Toast.makeText(contextWeakReference.get(), "num2 is illegal in ExponentCalculate", Toast.LENGTH_SHORT).show(); return "number entered illegal"; } else { float result = num1; while (num2-- >= 0) { result = result * num1; } return String.valueOf(result); } }}
工程结构截图如下:
简单工厂模式 也称 静态工厂模式,它很好诠释了面向对象编程的三大要素:封装,继承和多态。使代码有了良好的灵活性和可扩展性~
0 0
- 工厂模式-简单工厂
- 工厂模式-简单工厂
- 工厂模式-简单工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 简单工厂和工厂模式
- 简单工厂和工厂模式
- 1,工厂模式--简单工厂
- 简单工厂和工厂模式
- 简单工厂,工厂模式,抽象工厂
- 简单工厂,工厂模式,抽象工厂
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂模式和抽象工厂
- 带你读开源—ASP.NET_MVC(一)
- POJ 1556 The Doors (计算几何判断线段相交+最短路)
- 《UNIX环境高级编程》第5章标准IO中的内存流
- 【hdu 5795】A Simple Nim sg函数+脑洞+观察
- ${pageContext.request.contextPath} JSP取得绝对路径
- 简单工厂模式
- ffmpeg的h264转yuv实例测试代码
- 【poj1012】 Joseph
- 《JavaScript 闯关记》之表达式和运算符
- GitHub 使用 git 分布式版本控制系统
- LeetCode 16. 3Sum Closest LeetCode 18. 4Sum
- 三角形类雏形(2)
- P2020的LAW分析
- Unity UI(二):Rect Transform组件