通过抽象工厂模式再理解java的上转型

原创 2015年07月08日 14:48:58


最近在学习抽象工厂模式的时候,看到了他的优点之一---分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。
它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
一个抽象的工厂的接口
public interface AbstractFactory{
//具体方法略过
public Food getFood();
}
一个具体的工厂的实现
public class ConcreteFactory implements AbstractFactory{
public Food getFood(){
       return new Milk();
    }
public Water getWater(){
       return new Water();
    }
}
因为是说上转型的理解问题,所以产品就略过了。
直接client代码
public class Client{
    public void eat(AbstractFactory abs){
       System.out.println("A person eat "+k.getFood().getEatable()
              +" with "+k.getTableWare().getTool()+"!");
    }
关键说应用,看看client是怎么调用抽象工厂的,以及实现了怎样的分离。
       Client client= new Client();
       AbstractFactory cf = new ConcreteFactory();
       client.eat(cf);

就是红色标注部分,有人告诉我说我可以传另一个具体工厂给client,例如
cf = new ConcreteAAFactory();
所以说,对于client来说,生产的产品对自己来说是可见的,客户和生产类是没有分离的!!
无语!!!这里涉及到了一个很基本的java知识---上转型问题。
我们在eat的时候确实是具体工厂的getFood方法,但是,你要看清楚
AbstractFactory cf = new ConcreteFactory();
通过这个之后,cf已经是AbstractFactory类型,他将为这一次转换付出代价的,

你再也不能使用它的getWater方法。

上转型的得与失:
得:上转型对象可以操作和使用子类继承或者重写的方法。
失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。

由此可知,public void eat(AbstractFactory abs){}使用的永远都是AbstractFactory,你对AbstractFactory
修改,Client是不可知的,他不可能直接跨过AbstractFactory直接和ConcreteFactory进行生产联系,这是AbstractFactory不想看到。
其实这就像我们的外贸加工,客户和外贸公司签合同,外贸公司和代工工厂联系生产。外贸代表总是说我们的产品

怎么样,其实他是没有产品的,当客户真正需要产品的时候,外贸公司就要和代工工厂来点角色的转换。

有些人对于=总是漫不经心,基础的知识其实都是在细节当中。

比如说子类重写父类的方法时,重写方法的访问权限不能低于基类的权限

这是因为作为多态的体现,用子类去实例化父类对象(也就是上转型),权限小了你根本就没有办法调用这个子类的方法

通过抽象工厂模式再理解java的上转型

最近在学习抽象工厂模式的时候,看到了他的优点之一---分离了具体的类。 抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。 它将客户和类的实现分离,客户通过他...
  • wjbtian
  • wjbtian
  • 2014年04月18日 11:06
  • 599

JAVA中上转型对象的详细解释

JAVA中上转型对象的详细解释 首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转...
  • Jian_Sir
  • Jian_Sir
  • 2015年03月29日 20:05
  • 4122

上转型 下转型

Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象,且听我慢慢道来. 从2个名词开始说起:向上转型(upcasting) 、向下转型(downcas...
  • lalalademaxi
  • lalalademaxi
  • 2016年11月06日 17:16
  • 317

java入门-对象的上转型对象

我刚接触是觉得这个概念有点抽象,
  • xiaokehai
  • xiaokehai
  • 2014年10月25日 15:26
  • 416

上转型和下转型

java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。   什么叫父类引用指向子类对象,且听我慢慢道来.   从2个名词开始说起:向上转型(upcasting) 、向下转型(d...
  • shuaiqideyuge
  • shuaiqideyuge
  • 2015年10月07日 17:26
  • 1473

利用java反射机制实现动态向下转型

 前段时间我在使用hibernate的时候突然想到一个问题:我经常要对数据库中某条记录中的某个字段读取后进行判断,一般正规的操作流程是先使用session.get方法读取这条记录,并将其保存进一个hi...
  • xhdwell
  • xhdwell
  • 2009年03月08日 17:32
  • 1233

结合Java反射用简单工厂模式改进抽象工厂模式

前一篇简单介绍了抽象工厂模式,结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下: 去除IFactory、SqlserverFacto...
  • sdauzxl
  • sdauzxl
  • 2016年08月20日 12:01
  • 1014

Java 抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families of re...
  • liruikqn
  • liruikqn
  • 2013年10月20日 21:08
  • 22181

Java中多态 / 上转型对象 和接口回调的对比

多态 / 上转型上转型对象是多态的表现形式上转型对象就是指用子类创建一个对象,并把这个对象的引用放大父类的对象中。A 是 B 的父类A a;a = new B();或者A a;B b = new B(...
  • cuihao0532
  • cuihao0532
  • 2012年12月05日 17:21
  • 628

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过抽象工厂模式再理解java的上转型
举报原因:
原因补充:

(最多只允许输入30个字)