设计模式学习-简单工厂模式

本文介绍了工厂模式的基本概念及其在Java中的应用。通过一个简单的计算器例子,展示了如何使用工厂模式来创建对象,同时保持代码的扩展性和健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂模式(Factory Pattern)是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式的意图就是定义一个创建对象的接口,让其子类自己决定实例化哪个工厂类,工厂模式使其创建过程延迟到子类中进行。

这种方法的优点:调用者想创建一个对象,只需要知道其名称就可以、扩展性高,如果要增加一个产品,只要扩展一个工厂类就可以、屏蔽了产品的具体实现,调用者只需要关心产品接口。

缺点:每次增加一个新产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖,需要斟酌使用。

模式类图:



下面以一个简单计算器的例子实现简单工厂模式

由于需要获得运算的操作数所以这里选用了抽象类,但是和接口的作用是一样的,getresult()方法延迟到子类中实现。

package simplefactory.study.factory;

public abstract class Operation {

	// 操作数
	private double numberA;
	private double numberB;

	public double getNumberA() {
		return numberA;
	}

	public void setNumberA(double numberA) {
		this.numberA = numberA;
	}

	public double getNumberB() {
		return numberB;
	}

	public void setNumberB(double numberB) {
		this.numberB = numberB;
	}

	// 获得计算结果
	public abstract double getresult();

}

子类对于加减乘除的实现

package simplefactory.study.factory;

public class OperateAdd extends Operation {

	@Override
	public double getresult() {
		double result = getNumberA() + getNumberB();
		return result;

	}

}
package simplefactory.study.factory;

public class OperateSub extends Operation {

	@Override
	public double getresult() {

		double result = getNumberA() - getNumberB();

		return result;
	}

}

package simplefactory.study.factory;

public class OperateMul extends Operation {

	@Override
	public double getresult() {

		double result = getNumberA() * getNumberB();

		return result;
	}

}
package simplefactory.study.factory;

public class OperateDiv extends Operation {

	@Override
	public double getresult() {
		double result = 0;
		if (getNumberB() == 0) {
			System.out.println("除数不能为0");
		} else {
			result = getNumberA() / getNumberB();

		}
		return result;

	}

}
工厂类,根据不同需求实例化不同对象
package simplefactory.study.factory;

public class OperateFactory {

	public static Operation createOperate(String operate) {

		Operation operation = null;
		switch (operate) {
		case "+":
			operation = new OperateAdd();
			break;
		case "-":
			operation = new OperateSub();
			break;
		case "*":
			operation = new OperateMul();
			break;
		case "/":
			operation = new OperateDiv();
			break;
		}
		return operation;

	}

}

package simplefactory.study.factory;


public class Test {

	public static void main(String[] args) {
		// 获得抽象对象
		Operation operation;
		// 选择计算类型
		operation = OperateFactory.createOperate("+");
		operation.setNumberA(4);
		operation.setNumberB(13);
		// 获得结果
		double result = operation.getresult();
		System.out.println(result);

	}

}

这样的代码实现方式不管是什么样的显示方式,或者增加平方、开方运算等运算方式都只需要增加相应的运算子类修改运算工厂类就可以,不管新增的方法是否有问题都不会影响到我们已经存在的方法,提升了系统的健壮性。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值