大话设计模式之(一)工厂模式

(大话设计模式)
最近在研究大话设计模式,正好终结一下,以备自己后续查看。
书中对设计模式分类有28种,今天终结下最为常见的模式,工厂模式。工厂模式有三种:简单工厂模式,工厂方法模式,抽象工厂模式。
下面说说这三种模式的差异,并一一举以书中的例子加以说明。
简单工厂模式:用一个单独的类来做创建实例的过程,就是一个工厂,以此来增加设计的可扩展性,同时要求设计具有松耦合性质。下面以计算器为例子来说明。
原生的实现方式我们可以用一个操作类,这里class名为operation,用多个case来实现多种的操作方式,如:

public static double getResult(double numberA,double numberB,String operation){
		double result=0d;
		switch(operation){
		case "+":
				result=numberA+numberB;
				break;
		case "-":
			result=numberA-numberB;
			break;
		case "*":
			result=numberA*numberB;
			break;
		case "/":
			result=numberA/numberB;
			break;
		}
		return result;
	}

但这种方式的编写有一个明显的弊端,如果现在需要扩展运算,如开根号运算,就很麻烦。这时候简单工厂模式就起到作用。定义一个operation 父类

public 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 double GetResut(){
	  double result=0;
	 return result;
 }
}

子类为各运算方法重写父类getResult方法,如

public class AddOperation extends Operation{
 public double GetResut(){
	double result=0;
	result=getNumberA()+getNumberb();
	 return result;
 }
}

再定义一个工厂类,根据运算符号选择对应的子类运行,这样对于开根号运算就可以利用到加减乘除运算,对于新增的运行方法只需增加对应的子类,并在工厂中做相应的增加修改即可。
大家估计已经注意到简单工厂模式有一个弊端,那就是需要在客户端知道我要用到的是哪一种运行,并且每增加一种运行就需要在工厂中case一种运行符。
工厂模式很好的解决了这个问题,依然以上面的例子为例,工厂模式将实例化到其子类。定义一个工厂接口

public interface IFactory {
Operation CreateOperaton();
}
将实例化创建增加操作为例如下:

 public class AddFactory implements IFactory{
    
    	@Override
    	public Operation CreateOperaton() {		
    		return new AddOperation();
    	}
    }

因此客户端的运行只需要实例化对应的运算,即可。需要扩展其他运行无需再去修改工厂中的运算代码,只需要新建运行类,在实现工厂模式的,即可,完美的满足开放-封闭的设计原则。
最后,来说说抽象工厂模式,所谓的抽象是指简单工厂模式中的case条件我们并不事先确定,但里面的operaton运行基本一致,那我们可以用反射配置的方式来获取case的内容,从而根据反射的获取的内容创建到对应的operation操作,值得说明的是所有用简单工厂模式case得到的operation都可以用反射配置来实现。

猜你喜欢

转载自blog.csdn.net/u010342663/article/details/85222848