简单工厂模式

来源:互联网 发布:三维测量的算法 编辑:程序博客网 时间:2024/05/16 10:36
      在团队开发过程中,写出优雅的代码是一件很重要的事情,这就要求在写码时,注重代码的可读性,可扩展性和灵活性等等;因此熟练运用设计模式是一个优秀程序员必须要掌握的技能。最近又回过头来认真看《大话设计模式》一书,对其中内容的理解也的确和第一次草草阅读完全不一样了。所以计划整理一下,将自己对每种模式的理解写成学习笔记。
      面向对象编程很重要的三点就是“封装”,“继承”和“多态” 的灵活运用;这三点是保证代码低耦合非常重要的因素。比如在写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
原创粉丝点击