设计模式之工厂模式

 产品决定工厂,如果是很单一的产品,简单工厂就解决了。产品越复杂,工厂越复杂。

dota大家都玩过吧,恶魔巫师、剑圣两个英雄对应两个产品,我们把英雄的攻击方法抽象成一个接口,围绕这个我们讨论一下设计模式

简单工厂: 只有一个工厂;

interface Character {
    public void attack();
}

class Emowusi implements Character {

    @Override
    public void attack() {
        System.out.println("死亡一指");
    }
}

class Jiansheng implements Character {

    @Override
    public void attack() {
        System.out.println("无敌斩");
    }
}
class SimpleFactory<T> {
  public T create(Class<T> clazz) {
      try {
          return clazz.newInstance();
      } catch (InstantiationException e) {
          e.printStackTrace();
      } catch (IllegalAccessException e) {
          e.printStackTrace();
      }
      return null;
  }
}

main方法如下:

public static void main(String[] args) {
    SimpleFactory factoryMethod = new SimpleFactory();
    Character character = (Emowusi) factoryMethod.create(Emowusi.class);
    character.attack();
}

死亡一指

 

工厂方法模式:工厂改进为一个抽象工厂,每个类对应一个工厂,横向扩展会导致工厂也跟着扩展,但不会改变内部结构;

为什么需要引进工厂方法模式?在我们生成英雄的时候,不一定每个英雄都是很简单的new,有些英雄可能会很复杂,都写在一个factory里面会导致这个类不易于维护。

abstract class AbstractFacotyMethod {
    public abstract Character create();
}

class EmowusiFactoryMethod extends AbstractFacotyMethod {

    @Override
    public Character create() {
        System.out.println("***************恶魔巫师制造中***************");
        System.out.println("***************step 1***************");
        System.out.println("***************step 2***************");
        System.out.println("***************恶魔巫师完成***************");
        return new Emowusi();
    }
}

class JianshengFactoryMethod extends AbstractFacotyMethod {

    @Override
    public Character create() {
        System.out.println("***************剑圣制造中***************");
        System.out.println("***************step 1***************");
        System.out.println("***************step 2***************");
        System.out.println("***************step 3***************");
        System.out.println("***************剑圣完成***************");
        return new Jiansheng();
    }
}

英雄不变化,main方法如下:

public static void main(String[] args) {
    AbstractFacotyMethod emowusiFacotyMethod = new EmowusiFactoryMethod();
    Character otherCharacter = emowusiFacotyMethod.create();
    otherCharacter.attack();
}

***************恶魔巫师制造中***************
***************step 1***************
***************step 2***************
***************恶魔巫师完成***************
死亡一指

 

抽象工厂:当一类产品再细分成两类产品,工厂方法模式会增加两个工厂,而抽象工厂不会,但是内部结构会变化,在抽象工厂模式下同一个工厂对应不同的生产方法。

现在有新要求,剑圣有两种类别,红颜色恶魔巫师和蓝颜色恶魔巫师,该怎么设计呢,红色的人名币玩家,技能比较厉害!如果按照工厂模式,必然要增加工厂,思考一下!

abstract class AbstractFacoty {
    public abstract RedEmowusi createByRed();
    public abstract BlueEmowusi createByBlue();
}
class EmowusiFactory extends AbstractFacoty {

    @Override
    public RedEmowusi createByRed() {
        System.out.println("***************红色恶魔巫师制造中***************");
        System.out.println("***************step 1***************");
        System.out.println("***************step 2***************");
        System.out.println("***************红色恶魔巫师完成***************");
        return new RedEmowusi();
    }

    @Override
    public BlueEmowusi createByBlue() {
        System.out.println("***************蓝色恶魔巫师制造中***************");
        System.out.println("***************step 1***************");
        System.out.println("***************step 2***************");
        System.out.println("***************蓝色恶魔巫师完成***************");
        return new BlueEmowusi();
    }

}
interface RedCharacter {
    public void attack();
}

interface BlueCharacter {
    public void attack();
}

class RedEmowusi implements RedCharacter {

    @Override
    public void attack() {
        System.out.println("红色恶魔巫师 释放 死亡一指");
    }
}

class BlueEmowusi implements BlueCharacter {

    @Override
    public void attack() {
        System.out.println("蓝色恶魔巫师 释放 死亡一指");
    }
}

main方法如下:

public static void main(String[] args) {
    AbstractFacoty redEmowusiFacoty = new EmowusiFactory();
    RedCharacter character = redEmowusiFacoty.createByRed();
    character.attack();
}

***************红色恶魔巫师制造中***************
***************step 1***************
***************step 2***************
***************红色恶魔巫师完成***************
红色恶魔巫师 释放 死亡一指

 

转载于:https://my.oschina.net/u/2858987/blog/1552650

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值