概述
最近在学习抽象工厂模式的时候,看到了他的优点之一---分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。
它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
一个抽象的工厂的接口
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的上转型的全部内容,希望文章能够帮你解决通过抽象工厂模式再理解java的上转型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复