买了一本大话设计模式,开始我的设计模式之旅,可能是自己的技术不够,还是不怎么理解,写下来留纪念,有啥不正确的,望批评指正。
简单工厂模式,具体什么定义,网上有很多的版本了,自己可以百度一下。我就是按照自己的理解,工厂嘛,就是生产东西的,生产什么领导告诉就好了。Java的简单工厂,就是生产类(其他用途自己理解吧),根据不同参数创建不同的实例。
三个方面:
1.一个抽象类或者接口,(我这边用的是抽象类,里面声明了属性,如果用接口的话,属性值无法改变,如果只有方法,可以选择接口)
2.具体对象,实现类,具体的业务操作,继承或者实现抽象类或者接口
3. 工厂类,提供公共的方法,根据不同参数,返回具体类的对象
举个生活方面的例子,去奶茶店买饮品,你需要告诉服务员(相当于工厂类)你要饮料(抽象类或者接口),哪种饮料呢,总要有个标志呀,比如珍珠奶茶,珍珠奶绿(相当于参数),你不用关心具体他她给你添加什么水,什么颜料,只要他给你需要的奶茶,奶绿(相当于具体对象)就行了。
好吧,直接上代码,例子是一个简单的加减运算。
抽象类
package com.wqq.design.simplefactory;
/**
* @author wangqq
* @version 创建时间:2018年7月23日 上午10:58:42
* 抽象接口,定义一些抽象方法,用以子类实现
*/
public abstract class Operation {
double number1;
double number2;
/**
* private double number1;
* 声明私有的时候,要对外部提供get,set方法
*/
/**
* 每个运算都是为了得到结果
* @return
*/
public abstract double getResult();
}
加法
package com.wqq.design.simplefactory;
/**
* @author wangqq
* @version 创建时间:2018年7月23日 上午11:02:17
* 加法运算
*/
public class AddOperation extends Operation {
/**
* 子类再次声明参数时,测试时候无法取到值,这里牵扯到继承相关的知识点
*
*/
double number1; double number2;
@Override
public double getResult() {
return number1+number2;
} }
减法
package com.wqq.design.simplefactory;
/**
* @author wangqq
* @version 创建时间:2018年7月23日 上午11:05:48
* 减法运算
*/
public class SubtractionOperation extends Operation {
@Override
public double getResult() {
return number1-number2;
}
}
工厂类
package com.wqq.design.simplefactory;
/**
* @author wangqq
* @version 创建时间:2018年7月23日 上午11:08:38
* 工厂方法
*/
public class SimpleFactory {
/**
* 根据参数创建不同对象
* @param sign
* @return
* @throws Exception
*/
public static Operation createOperation(String sign) throws Exception{
if (null==sign || "".equals(sign)){
throw new Exception("运算符为空或不正确");
}
/*if ("+".equals(sign.trim())){
return new AddOperation();
}
if ("-".equals(sign.trim())){
return new SubtractionOperation();
}*/
Operation operation = null;
switch (sign.trim()) {
case "+":
operation = new AddOperation();
break;
case "-":
operation = new SubtractionOperation();
break;
default:
break;
}
return operation;
}
}
测试代码
package com.wqq.design.simplefactory;
/**
* @author wangqq
* @version 创建时间:2018年7月23日 上午11:07:06
* 类说明
*/
public class TestSimpleFactory {
public static void main(String[] args){
Operation operation;
try {
operation=SimpleFactory.createOperation("+");//向上造型
operation.number1=5;
operation.number2=6;
double result=operation.getResult();
System.out.println(result);
operation=SimpleFactory.createOperation("-");
operation.number1=10;
operation.number2=6;
System.out.println(operation.getResult());
/*
AddOperation addOperation=new AddOperation();
addOperation.number1=1;
addOperation.number2=2;
System.out.println(addOperation.getResult()); */
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:
如果子类有相同的属性名称,不会在调用父类的属性值,
operation=SimpleFactory.createOperation("+"); operation.number1=5; operation.number2=6;
这个是赋值给父类的属性,子类重写了属性,所以最后的输出是0.0 (如果解释有误的,望指正)
修改加法
package com.wqq.design.simplefactory; /** * @author wangqq * @version 创建时间:2018年7月23日 上午11:02:17 * 加法运算 */ public class AddOperation extends Operation { /** * 子类再次声明参数时,测试时候无法取到值 * double number1; * double number2; */ @Override public double getResult() { return number1+number2; } }
结果
好了,到此,算是简单理解了一下简单工厂模式