首页 > 代码库 > 【软考】向上转型 VS 简单工厂

【软考】向上转型 VS 简单工厂

今天我们不讲概念,先一起看一段程序。

public class Test{
	public static void main(String args[]){
		Test test=new Test();
		Animal a=new Animal("name");
		Cat c=new Cat("catname","name");
		Dog d=new Dog("dogname","black");
		test.f(a);test.f(c);test.f(d);
	}
	public void f(Animal a){
		System.out.println("name:"+a.name);
		if(a instanceof Cat){
			Cat cat=(Cat)a;
			System.out.println(""+cat.eyescolor+"eyes");
			}else if(a instanceof Dog){
				Dog dog=(Dog)a;
				System.out.println(""+dog.furColor+"fur");
			}
		}
	}
}


 这是一段比较简单的代码。对象转型实例。主程序中实例化了一个动物,一个猫一个狗。最妙的地方是f(Animal a)方法封装了cat和dog 的变化。使得客户端可以直接使用以下语句得到各自想要的结果。

          test.f(a);test.f(c);test.f(d);

而关键语句if(a instanceof Cat) 就是对象转型的一个具体实例。也就是如果动物a实例化的是一只猫,那么就是猫的属性。也就是一个基类的引用类型变量可以“指向”其子类的对象。

 

但是但是,这不是我想说的。

看到上面的一段程序 我突然就想到了之前学的设计模式。简单工程中的计算器的例子和这个好像。

public class OperationFactory
{
	public static Operation createOperate(string operate)
	{
		Operation oper=null;
		switch(operate){
			case"+";
				oper=new OperationAdd();
				break;
			case"-";
				oper=new OperationSub();
				break;
			case"*";
				oper=new OperationMul();
				break;
			case"/";
				oper=new OperationDiv();
				break;
		}
		return oper;
	}
}


客户端

Operation oper;
oper=OperationFactory.createOperate("+");
oper.NumberA=1;
oper.NumberB=2;
double result=oper.GetResult();


 

虽然一种是设计模式,一种只是一个用法吧,这种风马牛不相及的比较或许能碰触一些想法。

共同点:都会用一个类来做这个创造实例的过程。

不同点:简单工厂中只是单纯的判断几种不同的情况 即 “如果是“+”,则。。 。“ 而第一个例子的特点就是突出了基类和子类的关系。”如果操作符是加,则。。“

 

然后我们再来看看 对象转型

 通俗的说就是子类的对象可以基类的对象来使用。或基类的对象可以当做子类的对象来使用。当然还会有一些规则。如 基类的引用类型变量可以”指向“其子类的对象。

 

两个例子的确很像,只是通过这个去调动自己。真正的重点还在思考怎么样去学习。基础的比较,点滴积累。

 

 

 

【软考】向上转型 VS 简单工厂