zoukankan      html  css  js  c++  java
  • 设计模式--简单工厂模式

    简单工厂模式就是由一个工厂对象(Factory)决定创建出哪一种产品类的实例。

    需求:模拟一个计算器类

    首先定义一个抽象操作符类

     1 package com.sun.FactoryMethod;
     2 
     3 public abstract class AbsOperation {
     4     protected Double _numberA = 0d;
     5     protected Double _numberB = 0d;
     6 
     7     public Double get_numberA() {
     8         return _numberA;
     9     }
    10 
    11     public void set_numberA(Double _numberA) {
    12         this._numberA = _numberA;
    13     }
    14 
    15     public Double get_numberB() {
    16         return _numberB;
    17     }
    18 
    19     public void set_numberB(Double _numberB) {
    20         this._numberB = _numberB;
    21     }
    22 
    23     protected abstract Double GetResult();
    24 }

    继承抽象类 实现一个数字相加的抽象方法:

     1 package com.sun.FactoryMethod;
     2 
     3 public class OperationAdd extends AbsOperation {
     4 
     5     @Override
     6     protected Double GetResult() {
     7         Double result = 0d;
     8         result = _numberA + _numberB;
     9         return result;
    10     }
    11 }

    继承抽象类 实现一个数字相减的抽象方法:

     1 package com.sun.FactoryMethod;
     2 
     3 public class OperationSub extends AbsOperation {
     4 
     5     @Override
     6     protected Double GetResult() {
     7         Double result = 0d;
     8         result = _numberA - _numberB;
     9         return result;
    10     }
    11 }

    提供一个工厂类,根据操作符去实例化某个计算实例,这里得到的AbsOperation实际上是他子类的引用(java中子类能强制转换为父类,父类并不能强制转换为子类,除非

    父类的引用是指向子类):

     1 package com.sun.FactoryMethod;
     2 
     3 public class OperationFactory {
     4     public static AbsOperation createOperate(char operate) {
     5         AbsOperation operation = null;
     6         switch (operate) {
     7         case '+':
     8             operation = new OperationAdd();
     9             break;
    10         case '-':
    11             operation = new OperationSub();
    12             break;
    13         default:
    14             operation = new OperationAdd();
    15             break;
    16         }
    17 
    18         return operation;
    19     }
    20 }

    下面是测试类

     1 package com.sun.FactoryMethod;
     2 
     3 public class TestOperation {
     4 
     5     public static void main(String[] args) {
     6         AbsOperation operAdd;
     7         operAdd = OperationFactory.createOperate('+');
     8         operAdd._numberA = 1d;
     9         operAdd._numberB = 2d;
    10         System.out.println(operAdd.GetResult()); //3.0
    11         
    12         AbsOperation operSub;
    13         operSub = OperationFactory.createOperate('-');
    14         operSub._numberA = 2d;
    15         operSub._numberB = 4d;
    16         System.out.println(operSub.GetResult());//-2.0
    17     }
    18 
    19 }

    这里要顺便说一个switch case 语句 这里注意的是switch()的参数在jdk1.7之前是不支持字符串(String)的,现在支持了;

    那么如果我在switch case 某一项的时候并没有写break;会发生什么呢?

    如果我们的 case '+' 并没有写break,那么他会一直找有break的下一个方法返回;那test返回的结果就是 -1,-2了;

    如果是我们的 case '-' 没有break呢,那么他会一直找有break的下一个方法返回;那么他会走到Default:这里如果case '-' 后面再有一个'*'的话,那他就会实例化'*'这一项

    的结果,当然我们得保证'*'有break;

    那Default呢,他是不需要break的;

  • 相关阅读:
    第6章4节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
    Android RecyclerView And CardView
    openstack配置增加
    Failed to allocate the network(s), not rescheduling
    openstack 网络
    python
    云安全
    Python
    ERROR (ClientException): Unexpected API Error
    cocos2d-x 场景切换
  • 原文地址:https://www.cnblogs.com/sun-space/p/5568584.html
Copyright © 2011-2022 走看看