欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式之简单工厂

程序员文章站 2024-01-21 17:26:28
...

***如下面内容有问题请评论指正,感谢!***。
积小流而成江海,在前行的路上驻足不前就是后退。
昨天看了大话设计模式中的简单工厂,今天写下来让自己记忆更深刻。
大家想学习可以自行看一下大话设计模式。
附一个百度网盘链接
链接:https://pan.baidu.com/s/1GuDraXjeuXpD-bJatNQkFA
提取码:gpsq

首先说一下我理解的简单工厂模式,比如有一个大概念的类别(比如:人,动物,电器)等。
这些类别下面会有小类别,人分为男人和女人,动物有狗、猫…。

我们分别区分出他们相同的地方和不同的地方,把他们相同的地方单独拿出来创建一个接口,抽象方法,由子类去重写它。
子类各自重写了抽象方法,将各自对应的不同的地方写入对应的方法中。
创建工厂类,由工厂决定创建哪一个对象。

比如人类:
工厂可以继承人类并且重写父类接口、抽象方法,有多少个类可以添加多少个,对其他的不造成影响(解耦)。
如:
1、假如人类中需要男人—>继承人类并且重写其抽象方法—>在工厂类中操作,什么情况下需要创建男人这个对象。
2、假如人类中需要女人—>继承人类并且重写其抽象方法—>在工厂类中操作,什么情况下需要创建女人这个对象。
3、假如人类中需要添加一个妖人类—>继承人类并且重写其抽象方法—>在工厂类中操作,什么情况下需要创建妖人这个对象。
此时无论你添加男人、女人、妖人、兽人,或者在增加什么都不会影响你其他添加好的类。
在你的客户端中调用工厂方法传入相应参数来由工厂决定创建哪一个对象。

下面贴上大话设计模式中翻译的代码:
大话设计模式中是以计算机举例:
他们的共同点是全部都有两个数值,无论+,-,*,\ 都是有前后两个数值的。
所以写了一个父类当中有两个参数,numberOne 和 numberTow,并且写了一个getResult方法需要子类去重写
下面代码:

public class Operation {

	private Double numberOne;
	private Double numberTow;
	public Double getNumberOne() {
		return numberOne;
	}
	public void setNumberOne(Double numberOne) {
		this.numberOne = numberOne;
	}
	public Double getNumberTow() {
		return numberTow;
	}
	public void setNumberTow(Double numberTow) {
		this.numberTow = numberTow;
	}
	 
	public Double getResult(Double numberOne,Double numberTow) {
		Double result = 0d;
		return result;
	}
}

假如现在需要实现 加、减、乘、除 四个功能,那么就需要创建四个类。
每个类对应一个功能:

/**
 * 运算
 * @author Administrator
 *
 */
public class OperationS extends Operation{

	/**
	 * 加法运算
	 * @author Administrator
	 *
	 */	
	public class Plus extends Operation {
		@Override
		public Double getResult(Double numberOne,Double numberTow) {
			Double result = 0d;
			result = numberOne+numberTow;
			return result;
		}
	}
	
	/**
	 * 减法运算
	 * @author Administrator
	 *
	 */	
	public class Subtract extends Operation{
	
		@Override
		public Double getResult(Double numberOne,Double numberTow) {
			Double result = 0d;
			result = numberOne-numberTow;
			return result;
		}
	}	
	/**
	 * 乘法运算
	 * @author Administrator
	 *
	 */
	public class Multiply extends Operation{

		@Override
		public Double getResult(Double numberOne,Double numberTow) {
			Double result = 0d;
			result = numberOne*numberTow;
			return result;
		}
	}
	
	/**
	 * 除
	 * @author Administrator
	 *
	 */
	public class Divide extends Operation{

		@Override
		public Double getResult(Double numberOne,Double numberTow) {
			Double result = 0d;
			result = numberOne/numberTow;
			return result;
		}
	}
	
}

上面四个功能有了,那么还需要一个工厂类,没有工厂类怎么知道需要执行哪一个功能呢!

public class OperationFactory {
	
	/**
	 *  工厂类
	 * @param symbol  运算符号
	 * @return
	 */
	public static Operation getOperation(String symbol) {
		Operation operation = null;
		switch (symbol) {
		case "+":
			operation = new OperationS().new Plus();
			break;
		case "-":
			operation = new OperationS().new Subtract();
			break;
		case "*":
			operation = new OperationS().new Multiply();
			break;
		case "/":
			operation = new OperationS().new Divide();
			break;
		default:
			break;
		}
		return operation;
	}
		
}

下面就开始客户端代码了

/**
 * 
 * @author Administrator
 *
 */
public class Client {
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入第一个参数:");//10
		String a =  scanner.nextLine();
		System.out.println("请输入+ - * / 运算符:");//+
		String x =  scanner.nextLine();
		System.out.println("请输入第二个参数:");//4
		String b =  scanner.nextLine();
		//你不知道会调用=-*/哪一个子对象,所以返回的必须是父对象。这样无论哪一个子对象都没有问题
		Operation operation = OperationFactory.getOperation(x);//相当于 new OperationS().new Plus();
		//因为控制台输入的为+号所以走的Plus这个类,相当于下面那一段代码,创建父对象->创建Plus子对象
		//Plus operation = new OperationS().new Plus(); 
		//下面相当于向Plus子对象中传递两个数值
		Double result = operation.getResult(Double.valueOf(a),Double.valueOf(b));
		System.out.println(result);
		
	}