Java设计模式之从[星际争霸1]分析抽象工厂模式

来源:互联网 发布:泰森多边形算法 编辑:程序博客网 时间:2024/06/10 04:58

  抽象工厂模式是创建型模式之一。创建型模式有工厂模式(抽象工厂、工厂方法)、生成器模式、单体模式、原型模式四种。下面我来简单分析一下抽象工厂模式。

  抽象工厂模式的定义是创建一个提供一系列相关或相互依赖对象的接口,而无需指定它们具体的类。所有的创建型模式有一个特点,我们不关心工厂生产出来的具体对象的类型,我们会将其具体的类与工厂分离开来。这么说的话,很抽象难懂,下面是一个关于星际争霸的例子。

  在游戏星际争霸中,人族的兵营可以生产两种兵:机枪兵和火焰兵,机枪兵能够用机枪攻击,火焰兵能够用火焰枪来攻击。我们需要构建一个兵营,使得能够生产这两种兵,并且他们都有着自己的攻击方法。

  Java代码如下:

interface SoldierFactory{    Soldier ProduceMarine();    Soldier ProduceFirebat();}interface Soldier{    void attack();}class Marine implements Soldier{    public void attack(){        System.out.println("机枪兵用机枪扫射");    }}class Firebat implements Soldier{    public void attack(){        System.out.println("火焰兵使用喷火枪进行攻击");    }}class Barracks implements SoldierFactory{    public Soldier ProduceMarine(){        System.out.println("生成了一个机枪兵");        return new Marine();    }        public Soldier ProduceFirebat(){        System.out.println("生成了一个火枪兵");        return new Firebat();    }}class Demo{    public static void main(String[] args) {        Barracks myBarrack = new Barracks();        Soldier marine = myBarrack.ProduceMarine();        Soldier firebat = myBarrack.ProduceFirebat();        marine.attack();        firebat.attack();    }}

  抽象工厂SolderFactory接口声明了两种方法,生产机枪兵和生产火焰兵。每个兵种都能够攻击,因此它们均继承于Soldier接口。我们定义了Marine和Firebat类,将这两种兵种的行为实现了。最后,为了实现生产兵种,我们定义了一个兵营类Barracks,并实现了SolderFactory中的方法,分别在ProduceMarine和ProduceFirebat中实现了生产机枪兵和火焰兵的方法,并作为方法的返回值返回。

  在main方法中,我们看到了,我们先实例化了一个兵营myBarracks,然后用ProduceMarine和ProduceFirebat实现了兵种的生产,最后我们可以调用兵种的attack方法来让他们用自己的方式攻击。

  这里需要注意的是,我们在声明marine和firebat对象时,我们始终用的是Soldier这个接口来定义的,而不是用它们具体的类(Marine、Firebat)来进行定义。为什么要这么做?主要的原因还是为了实现分离,降低代码的耦合度;另外Marine和Firebat类,可能会存在别的方法,用Soldier来进行声明的话,就只会把attack方法暴露给我们。

  抽象工厂模式的缺点也是显而易见的。假设我们要为工厂增加幽灵特工(Ghost,也就是我们俗称的原子弹兵)和医疗兵,我们不得不修改SoldierFactory,为它增加ProduceGhost和ProduceMedic方法声明,这是不利于我们进行扩展的。也就是说,它难以支持新种类的产品。

 

 


5 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 破解版游戏闪退怎么办 安卓手机软件不兼容怎么办 安卓8.0软件闪退怎么办 游戏与手机系统不兼容怎么办 耳机和手机不兼容怎么办 软件和手机不兼容怎么办 小米6开关键失灵怎么办 同步助手下载不了微信旧版本怎么办 闲鱼退货卖家拒收怎么办 闲鱼把联系人删了怎么办 闲鱼付款了卖家不发货怎么办 红米4c卡怎么办 如果买鞋子买到假的怎么办 猎趣永久封号钱怎么办 支付宝换绑定手机后怎么办 为什么回收站的删除键不见了怎么办 微信在异地登录怎么办 支付宝帐号被冻结怎么办 进不了路由器设置页面怎么办 支付宝支付密码忘记了怎么办 淘宝忘记登录密码了怎么办 手机换卡了微信怎么办 淘宝退款成功后收到货怎么办 没收到货退款商家不处理怎么办 没收到货申请退款卖家不处理怎么办 京东已收到货却不处理退款怎么办 货退了卖家不退款怎么办 淘宝退了货卖家不退款怎么办 手机淘宝不显示图片怎么办 京东申请退款卖家不处理怎么办 企业网银冻结了怎么办 农行k宝坏了怎么办 手机检测不到u盾怎么办 农行有k宝怎么办信用卡 k米怎么点不了怎么办 c1驾照被扣3分怎么办 淘宝账号被黑了怎么办 淘宝卖家号虚假交易违规怎么办 扣扣申诉成功后怎么办 微信二维码收款异常怎么办 国际包裹被退回去了怎么办