• 设计模式--简单工厂模式


    简单工厂模式就是由一个工厂对象(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的;

  • 相关阅读:
    【BZOJ 4151 The Cave】
    【POJ 3080 Blue Jeans】
    【ZBH选讲·树变环】
    【ZBH选讲·拍照】
    【ZBH选讲·模数和】
    【CF Edu 28 C. Four Segments】
    【CF Edu 28 A. Curriculum Vitae】
    【CF Edu 28 B. Math Show】
    【CF Round 439 E. The Untended Antiquity】
    【CF Round 439 C. The Intriguing Obsession】
  • 原文地址:https://www.cnblogs.com/sun-space/p/5568584.html
Copyright © 2020-2023  润新知