设计模式之-----简单工厂模式

首先说明什么是简单工厂模式:(取自百度百科)

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

用途:

外界不必关心创建对象的具体细节,只需要调用工厂方法,然后使用对象即可,一般只在简单的情况下使用。

缺点:

工厂类中所能创建的类只可以是事先考虑好的,若要新增类,则要改变工厂类,这在一定程度上违反了“开-闭原则”。

代码示例(代码功能为简单的计算器,给定两个值,输出结果)

代码结构:

代码很简单,不过用到了简单工厂模式设计;

首先,IOperation接口,定义了计算结果的方法,每个实现该接口的类必须重写该方法

package com.operation.intf;

/**
 * 计算接口,让每一个运算符继承
 * 
 * @author ZHENGWEI
 * 
 */
public interface IOperation {
	/**
	 * 计算结果的方法
	 * 
	 * @return 最后计算结果
	 */
	public double getResult(double numberOne, double numberTwo);
}

其次,实现这个接口的AddOperation类,重写了getResult方法,返回他们相加的结果

package com.operation.impl;

import com.operation.intf.IOperation;

/**
 * 加法的实现类
 * 
 * @author ZHENGWEI
 * 
 */
public class AddOperation implements IOperation {

	/**
	 * 返回加法结果
	 */
	public double getResult(double numberOne, double numberTwo) {
		return numberOne+numberTwo;
	}

}
下边重点来了,OperationFactory工厂类,负责创建实例对象

package com.operation.factory;

import com.operation.impl.AddOperation;
import com.operation.intf.IOperation;

/**
 * 生成运算对象的简单工厂类
 * 
 * @author ZHENGWEI
 * 
 */
public class OperationFactory {

	/**
	 * 根据不同参数,返回不同类的实例
	 * 
	 * @param opera
	 * @return
	 */
	public static IOperation creatrOperation(int opera) {
		IOperation iOperation = null;
		switch (opera) {
		case 1:
			iOperation = new AddOperation();
			break;
		default:
			break;
		}
		return iOperation;
	}
}

需要说明的是,这里的静态方法之所以接收int型,是因为java本身并不支持在switch-case中匹配String型数据,否则直接将“+”,“-”等符号传过来就ok啦,这里1代表加法

下面是测试类

package com.operation.main;

import com.operation.factory.OperationFactory;
import com.operation.intf.IOperation;

public class TestMain {

	/**
	 * 测试类
	 * @param args
	 */
	public static void main(String[] args) {
		//测试类只需要与工厂类耦合
		IOperation iOperation = OperationFactory.creatrOperation(1);
		System.out.println(iOperation.getResult(1,1));
	}

}

很明显,输出结果为2.0,并且,测试类TestMain并没有与AddOperation类耦合,它是通过工厂类返回一个AddOperation类的实例,当需要创建的类较多时,这种优势极为明显。

若现在需求发生变化,要增加一个减法类,则只需以下步骤

1、新建类SubOperation,并且实现IOperation接口

package com.operation.impl;

import com.operation.intf.IOperation;

/**
 * 减法的实现类
 * 
 * @author ZHENGWEI
 * 
 */
public class SubOperation implements IOperation {

	/**
	 * 返回减法计算结果
	 */
	public double getResult(double numberOne, double numberTwo) {
		return numberOne - numberTwo;
	}

}

2、修改OperationFactory工厂类,修改后如下(只需加一个case语句)

package com.operation.factory;

import com.operation.impl.AddOperation;
import com.operation.impl.SubOperation;
import com.operation.intf.IOperation;

/**
 * 生成运算对象的简单工厂类
 * 
 * @author ZHENGWEI
 * 
 */
public class OperationFactory {

	/**
	 * 根据不同参数,返回不同类的实例
	 * 
	 * @param opera
	 * @return
	 */
	public static IOperation creatrOperation(int opera) {
		IOperation iOperation = null;
		switch (opera) {
		case 1:
			iOperation = new AddOperation();
			break;
		case 2:
			iOperation = new SubOperation();
			break;
		default:
			break;
		}
		return iOperation;
	}
}

3、测试类

//原来的
IOperation iOperation = OperationFactory.creatrOperation(1);
System.out.println(iOperation.getResult(1,1));
//现在的
IOperation iOperation = OperationFactory.creatrOperation(2);
System.out.println(iOperation.getResult(1,1));
显然,第一个是2.0,第二个是0.0

其他的操作也一样,只需增加新类,在工厂类中增加逻辑判断即可。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值