优点:

  1.不用自己再去new对象,工厂会根据给的标识,自动替你new出一个你想要的实现类对象。

  2.一定程度上在加减乘除之间实现了解耦合。提高了代码的复用性和扩展性。

缺点:违反了开闭性,即新增功能还需要在源代码上修改。

一、整体思想图:

 

 

 二、代码实现

  2.1 抽取固定模块类

package com.design.bean;

/**
 * 简单工厂模式——父类(抽取固定模块)
 * @author phoebe
 *
 */
public class CaculateBean {
	private double a;
	private double b;
	private double result;
	public double getA() {
		return a;
	}
	public void setA(double a) {
		this.a = a;
	}
	public double getB() {
		return b;
	}
	public void setB(double b) {
		this.b = b;
	}
	public double getResult() {
		return result;
	}
	public void setResult(double result) {
		this.result = result;
	}
	
	
	
}

  2.2 加法模块:

package com.design.calimpl;

import com.design.bean.CaculateBean;

/**
 * 加法模块
 * @author phoebe
 *
 */
public class Caculate_add extends CaculateBean {

	@Override
	public double getResult() {
		return this.getA()+this.getB();
	}
}

  2.3减法模块/乘法模块/除法模块和加法模块一样

  2.4产生具体实例化对象工厂

  

package com.design.factory;

import com.design.bean.CaculateBean;
import com.design.calimpl.Caculate_add;
import com.design.calimpl.Caculate_div;
import com.design.calimpl.Caculate_multi;
import com.design.calimpl.Caculate_sub;
import com.design.util.myException;

/**
 * 控制具体采用哪一个实现类
 * @author phoebe
 *
 */
public class CaculateFactory {

	public static CaculateBean getBeanFactory(String str){
		switch(str){
			case "+" :
				return new Caculate_add();
			case "-" :
				return new Caculate_sub();
			case "*" :
				return new Caculate_multi();
			case "/" :
				return new Caculate_div();
			default:
			try {
				throw new myException();
			} catch (myException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
}

   2.5测试代码

  

package com.design.test;

import java.util.Scanner;

import com.design.bean.CaculateBean;
import com.design.factory.CaculateFactory;

/**
 * 测试
 * @author phoebe
 *
 */
public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		double a = sc.nextDouble();
		double b = sc.nextDouble();
		String tig = sc.next();
		CaculateBean caculateBean = CaculateFactory.getBeanFactory(tig);
		caculateBean.setA(a);
		caculateBean.setB(b);
		System.out.println(caculateBean.getResult());
	}
}