现在的位置: 首页 > 综合 > 正文

简单工厂模式–Java

2012年04月23日 ⁄ 综合 ⁄ 共 3128字 ⁄ 字号 评论关闭

简单工厂模式:由一个叫做工厂类的东西决定生产什么样的实例,你只要传递一个信息给工厂类,工厂类就知道应该生产什么样的产品。

工厂:生产具体产品的东西

产品:继承了一个基类或者接口,这个接口或基类抽象出了公共的变量和方法,具体实现由产品去实现

优点:松耦合,添加功能方便

例:使用简单工厂模式实现一个计算器类

1、建立一个抽象基类

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public abstract class Operator {
	private Double numA;  //第一个操作数
	private Double numB;  //第二个操作数
	public Double getNumA() {
		return numA;
	}
	public void setNumA(Double numA) {
		this.numA = numA;
	}
	public Double getNumB() {
		return numB;
	}
	public void setNumB(Double numB) {
		this.numB = numB;
	}
	/**
	 * 运算方法,由具体的类实现
	 * @return
	 */
	public abstract Double getResult();

}

2、四个具体实现类 实现 加 减 乘 除

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public class OperatorAdd extends Operator {

	@Override
	public Double getResult() {
		return this.getNumA() + this.getNumB();
	}

}

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public class OperatorSub extends Operator {

	@Override
	public Double getResult() {
		return this.getNumA() - this.getNumB();
	}

}

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public class OperatorMuti extends Operator{

	@Override
	public Double getResult() {
		return this.getNumA() * this.getNumB();
	}

}

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public class OperatorDiv extends Operator{
	@Override
	public Double getResult() {
		if (this.getNumB() == 0) {
			throw new RuntimeException("除数不能为0!!!");
		}
		return this.getNumA() / this.getNumB();
	}

}

3、实现工厂类

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public class OperatorFactory {
	public static Operator operators(String oper){
		Operator operator = null;
		switch (oper) {
		case "+":
			operator = new OperatorAdd();
			break;
		case "-":
			operator = new OperatorSub();
			break;
		case "*":
			operator = new OperatorMuti();
			break;
		case "/":
			operator = new OperatorDiv();
			break;

		default:
			break;
		}
		return operator;
	}
}

4、测试

/**
 *Jun 27, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.example.simplefactory;

public class Caculator {
	
	public static void main(String[] args) {
		Operator operators = OperatorFactory.operators("+");
		operators.setNumA(5.0);
		operators.setNumB(6.0);
		System.out.println(operators.getResult());
		
		Operator operators2 = OperatorFactory.operators("-");
		operators2.setNumA(5.0);
		operators2.setNumB(6.0);
		System.out.println(operators2.getResult());
		
		Operator operators3 = OperatorFactory.operators("*");
		operators3.setNumA(5.0);
		operators3.setNumB(6.0);
		System.out.println(operators3.getResult());
		
		Operator operators4 = OperatorFactory.operators("/");
		operators4.setNumA(5.0);
		operators4.setNumB(6.0);
		System.out.println(operators4.getResult());
		
		Operator operators5 = OperatorFactory.operators("/");
		operators5.setNumA(5.0);
		operators5.setNumB(0.0);
		System.out.println(operators5.getResult());
	}

}

---------------------------------------------------------

例子改编自《大话设计模式》 作为学习记录

抱歉!评论已关闭.