该模式我们以计算器的计数算法为例子:
同样,如果我们不知道设计模式的话,我们要写一个加减乘除的计算器我们要怎么做?当然,这很简单
public static void main(String args[]) { Scanner scn = new Scanner(System.in); System.out.print("第一个数:"); int a = scn.nextInt(); System.out.print("操作(+,-,*,/):"); String option = scn.next(); System.out.print("第二个数:"); int b = scn.nextInt(); int result = 0; if ("+".equals(option)) { result = a + b; } if ("-".equals(option)) { result = a - b; } if ("*".equals(option)) { result = a * b; } if ("/".equals(option)) { result = a / b; } System.out.println("结果:" + result); }
可是呢,如果我们要增加计算器的算法功能,比如说加个开根号的算法,要怎么做,再加个判断条件吗,这样子的话就耦合度不高了。程序的设计原则不就是高内聚,低耦合吗。以及面向对象的的三大特点:封装、继承、多态。
知道了这些之后,我们再看看用简单工厂模式下,如何完成此操作:
/** * 计算器类 * Created by HDL on 2016/11/30. */ public class Optioner { private int oNumFirst;//第一个数 private int oNumSecond;//第二个数 public int getoNumFirst() { return oNumFirst; } public void setoNumFirst(int oNumFirst) { this.oNumFirst = oNumFirst; } public int getoNumSecond() { return oNumSecond; } public void setoNumSecond(int oNumSecond) { this.oNumSecond = oNumSecond; } public Optioner() { } public Optioner(int oNumFirst, int oNumSecond) { this.oNumFirst = oNumFirst; this.oNumSecond = oNumSecond; } public int getReuslt() { return 0; } }
/** * 加法运算 * Created by HDL on 2016/11/30. */ public class AddOptioner extends Optioner { @Override public int getReuslt() { return getoNumFirst() + getoNumSecond(); } } /** * 减法运算 * Created by HDL on 2016/11/30. */ public class SubOptioner extends Optioner { @Override public int getReuslt() { return getoNumFirst() - getoNumSecond(); } } /** * 乘法运算 * Created by HDL on 2016/11/30. */ public class MulOptioner extends Optioner { @Override public int getReuslt() { return getoNumFirst() * getoNumSecond(); } } /** * 除法运算 * Created by HDL on 2016/11/30. */ public class DivOptioner extends Optioner { @Override public int getReuslt() { if (getoNumSecond() == 0) { System.out.println("除数不能为0"); return -1; } else { return getoNumFirst() / getoNumSecond(); } } }
/** * optioner工厂类 * Created by HDL on 2016/11/30. */ public class OptionerFactory { public static Optioner createOptioner(String opt) { Optioner optioner = null; switch (opt) { case "+": optioner = new AddOptioner(); break; case "-": optioner = new SubOptioner(); break; case "*": optioner = new MulOptioner(); break; case "/": optioner = new DivOptioner(); break; } return optioner; } }
public static void main(String args[]) { Scanner scn = new Scanner(System.in); System.out.print("请输入第一个数:"); int oNumFirst = scn.nextInt(); System.out.print("请输入操作方式(+,-,*,/):"); String opt = scn.next(); System.out.print("请输入第二个数:"); int oNumSecond = scn.nextInt(); Optioner optioner = OptionerFactory.createOptioner(opt); optioner.setoNumFirst(oNumFirst); optioner.setoNumSecond(oNumSecond); System.out.println("结果为:" + optioner.getReuslt()); }对于添加开根号功能,直接增加开根号的类并继承Optioner类,在工厂类加上分支判断即可,业务的增加不会影响视图层的功能,大大降低了代码之间的耦合性。 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。