日期:2014-05-19  浏览次数:20395 次

关于petshop的数据工厂返射模式~~~~~~~~~~
我依照petshop这样写了一个工程.但我发现在反射生成实例时.得到的类实例只能访问接口里定义的方法.而不能访问接口里没有的方法.

这我就奇怪了.那不是要把接口和具体实现类的方法写成一对一的关系.

这种方法好像是为了强制实现类必须实现.  

不知道是不是这样.但感觉这样好麻烦????   一定要写成一对一关系.

------解决方案--------------------
得到的类实例只能访问接口里定义的方法.而不能访问接口里没有的方法.
-------------------------------
这个是当然的,要不然干吗要接口呢?难道只是摆设?

这我就奇怪了.那不是要把接口和具体实现类的方法写成一对一的关系.
-------------------------
说实话我也很奇怪,为什么petshop要用反射来实例化呢,为啥不用new 呢?

好好看看书,看看工厂方法是为了解决什么问题。然后再来问这个问题。
模式虽好,但也不能乱用
------解决方案--------------------
test
------解决方案--------------------
我不看petshop这种浪费时间的例子。不过我估计着大概给你举例回答一下:

我们假设有以下领域设计:

class 鸭嘴兽:哺乳动物,I禽类
{
.....
public bool 是否怀孕;
public int I禽类.是否会飞;
}

class 人工繁殖鸭嘴兽:鸭嘴兽,I动物园里的动物
{
public Image I动物园里的动物.图片;
public void I动物园里的动物.捐款()
{
......
}
}

关系数据库表可能是这样设计的:

饲养动物(饲养员姓名,动物编号)
动物(动物编号,真正类型)
鸭嘴兽(动物编号,是否怀孕,是否能飞)
人工繁殖鸭嘴兽(动物编号,图片)

而程序的业务逻辑大致是:给出动物编号,然后再屏幕上显示这个动物的具体信息例如图片等,用户可以在网页上捐款。此时,程序首先根据动物编号找出真正的具体类型——人工繁殖鸭嘴兽,然后实例化它,然后返回的着一只人工饲养鸭嘴兽被赋值给网页定义的“I动物园里的动物”类型的变量,用于处理捐款。
------解决方案--------------------
显然,网页上就是针对“I动物园里的动物”类型的对象进行处理的。不论传给它的对象是什么类型,只要具有I动物园里的动物接口就可以了。页面并不处理“否怀孕,是否能飞”等特性,不知道也不过问,尽管传给它的对象可能(也可能)具有这些属性或方法,页面并不关心。因为业务的多态处理仅需要涉及“I动物园里的动物”接口类型。

你说这里的“I动物园里的动物”跟“人工繁殖的鸭嘴兽”、“鸭嘴兽”、“哺乳动物”、“动物”有什么“麻烦的”意义对应关系呢?这中抽象、多态能力是很方便的。

有些人很难理解不同类型的继承、接口的“is a”概念,只能理解对象之间“has a”的聚合关系,不能理解抽象的作用只能理解最直观的实体存在,那么所理解的系统设计就不是面向对象的,顶多是“基于对象”的,缺少几乎所有面向对象的好处。
------解决方案--------------------
尽管传给它的对象可能(也可能)具有 --> 尽管传给它的对象可能(也可能不)具有
有什么“麻烦的”意义对应关系呢 --> 有什么“麻烦的”“一一对应关系”呢
------解决方案--------------------
“I动物园里的动物”其实跟其他概念没有什么关系,它们对象的某个实例也没有必然的联系。

I动物园里的动物abc并不必然是鸭嘴兽abc,甚至也并不必然是动物abc,但是人工饲养鸭嘴兽xyz必然是鸭嘴兽xyz、动物xyz和I动物园里的动物xyz。这里的“是”是上面所说的“is a”关系。