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

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

原文地址:https://www.cnblogs.com/sun-space/p/5568584.html