首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>软件工程>算法分析>图解+实例讲解java中设计模式中的简单工厂模式
图解+实例讲解java中设计模式中的简单工厂模式
来源: 发布时间:2008-09-22 发布人: 浏览: 人次   字体: [ ]  


现在又有一个问题,如果我们不仅卖奔驰和福特,我们还卖别的牌子的汽车,也就是说如果我们现在要扩充一个子类,就必须去修改“工厂”(class Factory),在“工厂”中在添加一个if去判断并去实例化相应的子类,例如我们想要销售丰田汽车,就必须修改“工厂”。怎样解决这个问题呢?
我们现在要解决的问题是,扩充子类,怎样不用去修改工厂:如果是用java语言来实现的话,我们自然会想到利用java的反射机制注2
注2:java的反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
用java的反射机制解决这个问题,那么在“工厂”中就不用if判断了,



这个时候在客户端的Car c=Factory.getCarInstance(“Benz”);中无论是输入Benz还是输入Ford都会等到正确的运行结果。完整的程序如下:
package org.chenb.factorydemo;

interface Car{
    public void stock();
    public void sell();
}

class Benz implements Car{
    public void stock(){
        System.out.println("Benz进货了………");
    }
    public void sell(){
        System.out.println("Benz卖出了………");
    }
}
class Ford implements Car{
    public void stock(){
        System.out.println("Ford进货了………");
    }
    public void sell(){
        System.out.println("Ford卖出了………");
    }
}

class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
              c=(Car)Class.forName("org.chenb.factorydemo."+type).newInstance();
        } catch (InstantiationException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
        } catch (IllegalAccessException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
        } catch (ClassNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
        }
   
        return c;
    }
}
public class FactoryDemo {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Benz");
        if(c!=null){
              c.stock();
              c.sell();
        }else{
              System.out.println("无此类型的汽车销售……");
        }
       
    }

}

这个时候,如果我们添加一个子类,比如我们除销售奔驰、福特以外,还要销售丰田、奇瑞,就不需要去修改工厂了,只要去添加一个子类即可,例如我们要销售丰田汽车了,就添加一个子类Toyota去实现汽车接口:
class Toyota implements Car{

    public void stock(){
        System.out.println("Toyota进货了………");
    }
    public void sell(){
        System.out.println("Toyota卖出了………");
    }
}
在客户端的Car c=Factory.getCarInstance(“Toyota”);中输入Toyota即可。
其实这也实现了面对对象设计的一个很重要的原则—开闭原则(OCP),即一个软件实体应当对扩展开放,对修改关闭。

共2页: 上一页 [1] 2 下一页
↓下一篇:没有了
相 关 文 章   发布商链接
·查找算法集:顺序查找、二分查找、插...
·顺序队列示例基本操作
·java实现合并连续数字的算法代码
·软件工程设计模式之工厂和原型的对比
·java实现输出1到100中的偶数算法
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·java实现合并连续数字的算法...
·顺序队列示例基本操作
·查找算法集:顺序查找、二分...
热 门 文 章
·顺序队列示例基本操作
·查找算法集:顺序查找、二分...
·软件工程设计模式之工厂和原...
·java实现输出1到100中的偶数...
·java实现合并连续数字的算法...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .