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

设计模式—简单工厂模式+实例

2013年01月22日 ⁄ 综合 ⁄ 共 2648字 ⁄ 字号 评论关闭

简单工厂模式:实质是一个工厂类根据传入的参数,动态决定创建哪个产品类的实例,这些产品类继承自一个类或接口;

解决问题:到底实例化谁,将来会不会增加实例化的对象;对于很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程。

实例:输入两个数和运算符,得到运算结果

1、创建抽象对象类Operation.java,具体对象类OperateAdd,java,OperateDivide.java,OperateMultiply.java,OperateSubtrct.java,工厂类OperateFactory.java,视图类OperateMain.java

2、具体实现

OperateMain.java:

package com.test.factory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

import com.sun.corba.se.spi.orb.OperationFactory;

public class OperateMain {
	
	private static int numberA;
	private static int numberB;
	private static InputStreamReader inputStreamReader;
	private static BufferedReader bufferReader;
	
	public static void main(String[] args){
		try {
			System.out.println("please input a number:");
			inputStreamReader = new InputStreamReader(System.in);
			bufferReader = new BufferedReader(inputStreamReader);
			numberA = Integer.parseInt(bufferReader.readLine());
			System.out.println("please input a operate:");
			Scanner input = new Scanner(System.in);
			String operate = input.next();
			System.out.println("please input a number again:");
			inputStreamReader = new InputStreamReader(System.in);
			bufferReader = new BufferedReader(inputStreamReader);
			numberB = Integer.parseInt(bufferReader.readLine());
			Operation oper = OperateFactory.createOperation(operate);
			oper.numberA = numberA;
			oper.numberB = numberB;
			System.out.println(numberA + operate + numberB + " = "+oper.getResult());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Operation.java:

package com.test.factory;

public class Operation {

	public int numberA,numberB;
	public float result;
	
	public float getResult(){		
		return result;
	}
}

OperateAdd.java:

package com.test.factory;

public class OperateAdd extends Operation{

	@Override
	public float getResult() {
		// TODO Auto-generated method stub
		return numberA + numberB;
	}
		
}

OperateFactory.java:

package com.test.factory;

public class OperateFactory {
	
	public static Operation createOperation(String operate){
		if (operate.equals("+")){
			return new OperateAdd();
		} else if(operate.equals("-")) {
			return new OperateSubtract();
		} else if (operate.equals("*")){
			return new Operatemultiply();
		} else if (operate.equals("/")){
			return new OperateDivide();
		}
		return null;
	}
	
}

3、Operation类中两个int属性,一个getResult方法行为;

加减乘除类都继承Operation类,重写getResult方法;

OperationFactory为工厂类,根据传入的String参数,动态创建具体运算类,创建何种运算类,怎么创建,都在这个类中实现;

4、运行如下:

优点
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

抱歉!评论已关闭.