简单工厂模式(Factory Pattern)

简单工厂模式又 叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 
我们从一个例子展开,现在有一道面试题:使用java实现一个计算机控制台程序,要求输入数的运算,得到结果。 
这道题目最原始的写法:

public class Client {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        float num1  = in.nextFloat();
        System.out.println("请输入第二个数字:");
        float num2  = in.nextFloat();
        System.out.println("请输入运算符号:");
        String mark = in.next();
        if("+".equals(mark)){
            System.out.println("result : "+(num1+num2));
        }else if("-".equals(mark)){
            System.out.println("result : "+(num1-num2));
        }else if("*".equals(mark)){
            System.out.println("result : "+(num1*num2));
        }else if("/".equals(mark)){
            System.out.println("result : "+(num1/num2));
        }
    }
}

上面的写法实现虽然简单,但是却没有面向对象的特性,代码拓展性差,显然不是出题者想要考察的意图。 
那么面向对象编程要如何在题中体现呢? 
请看下面这段代码:



abstract class Operation {
	public abstract float getResult(float num1, float num2);
}

//加法运算
class Addition extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 + num2;
	}
}

class Subtraction extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 - num2;
	}
}

class Multiplication extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 * num2;
	}

}

class Division extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 / num2;
	}

}

class SimpleFactory {
	public static Operation getOperation(String mark) {
		Operation o = null;
		switch (mark) {
		case "+":
			o = new Addition();
			break;
		case "-":
			o = new Subtraction();
			break;
		case "*":
			o = new Multiplication();
			break;
		case "/":
			o = new Division();
			break;
		default:
			break;
		}
		return o;
	}
}

public class Client {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        float num1  = in.nextFloat();
        System.out.println("请输入第二个数字:");
        float num2  = in.nextFloat();
        System.out.println("请输入运算符号:");
        String mark = in.next();
        System.out.println("result:"+count(num1,num2,mark));
	}
	public static float count(float num1,float num2,String mark) {
		Operation o = SimpleFactory.getOperation(mark);
		return o.getResult(num1, num2);
	}
}

简单工厂将对象的创建过程进行了封装,用户不需要知道具体的创建过程,只需要调用工厂类获取对象即可。这种简单工厂的写法是通过switch-case来判断对象创建过程的。在实际使用过程中,违背了 开放-关闭原则,当然有些情况下可以通过反射调用来弥补这种不足。那么我们现在再来看看简单工厂模式。

简单工厂模式

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
它由三种角色组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中SimpleFactory的类。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Operation接口,其实也就是下面类图中的AbstractProduct,就是名字不一样而已。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Addtion、Subtraction、Multiplication、Division类。
来用类图来清晰的表示下的它们之间的关系:


猜你喜欢

转载自blog.csdn.net/qq_39241239/article/details/83276111
今日推荐